zoukankan      html  css  js  c++  java
  • Codeforces Round #523 (Div. 2) C. Multiplicity

    C. Multiplicity
    time limit per test
    3 seconds
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    You are given an integer array a1,a2,,ana1,a2,…,an .

    The array bb is called to be a subsequence of aa if it is possible to remove some elements from aa to get bb .

    Array b1,b2,,bkb1,b2,…,bk is called to be good if it is not empty and for every ii (1ik1≤i≤k ) bibi is divisible by ii .

    Find the number of good subsequences in aa modulo 109+7109+7 .

    Two subsequences are considered different if index sets of numbers included in them are different. That is, the values ​of the elements ​do not matter in the comparison of subsequences. In particular, the array aa has exactly 2n12n−1 different subsequences (excluding an empty subsequence).

    Input

    The first line contains an integer nn (1n1000001≤n≤100000 ) — the length of the array aa .

    The next line contains integers a1,a2,,ana1,a2,…,an (1ai1061≤ai≤106 ).

    Output

    Print exactly one integer — the number of good subsequences taken modulo 109+7109+7 .

    Examples
    Input
    Copy
    2
    1 2
    Output
    Copy
    3
    Input
    Copy
    5
    2 2 1 22 14
    Output
    Copy
    13
    Note

    In the first example, all three non-empty possible subsequences are good: {1}{1} , {1,2}{1,2} , {2}{2}

    In the second example, the possible good subsequences are: {2}{2} , {2,2}{2,2} , {2,22}{2,22} , {2,14}{2,14} , {2}{2} , {2,22}{2,22} , {2,14}{2,14} , {1}{1} , {1,22}{1,22} , {1,14}{1,14} , {22}{22} , {22,14}{22,14} , {14}{14} .

    Note, that some subsequences are listed more than once, since they occur in the original array multiple times.

    题意

      给一个序列a,求a的good子序列b,good的定义为:对于bi可以整除i。求一共多少种good子序列。

    分析

      考虑dp,dp[i][j]表示在a1 a2 a3 a4......ai中长度为j的good序列的个数。所以结果就是ni=1dp[n][i],

          dp[i1][j]+dp[i1][j1]              if a[i] is a multiple of j

      dp[i][j]=

          dp[i1][j]                                 otherwise

      二维会超内存,所以用第一维都是dp[i-1],所以用一维数组存就可以了。

      

    ///  author:Kissheart  ///
    #include<stdio.h>
    #include<algorithm>
    #include<iostream>
    #include<string.h>
    #include<vector>
    #include<stdlib.h>
    #include<math.h>
    #include<queue>
    #include<deque>
    #include<ctype.h>
    #include<map>
    #include<set>
    #include<stack>
    #include<string>
    #define INF 0x3f3f3f3f
    #define FAST_IO ios::sync_with_stdio(false)
    const double PI = acos(-1.0);
    const double eps = 1e-6;
    const int MAX=1e6+10;
    const int mod=1e9+7;
    typedef long long ll;
    using namespace std;
    #define gcd(a,b) __gcd(a,b)
    inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
    inline ll qpow(ll a,ll b){ll r=1,t=a; while(b){if(b&1)r=(r*t)%mod;b>>=1;t=(t*t)%mod;}return r;}
    inline ll inv1(ll b){return qpow(b,mod-2);}
    inline ll exgcd(ll a,ll b,ll &x,ll &y){if(!b){x=1;y=0;return a;}ll r=exgcd(b,a%b,y,x);y-=(a/b)*x;return r;}
    inline ll read(){ll x=0,f=1;char c=getchar();for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;for(;isdigit(c);c=getchar()) x=x*10+c-'0';return x*f;}
    //freopen( "in.txt" , "r" , stdin );
    //freopen( "data.txt" , "w" , stdout );
    ll n,ans;
    ll a[MAX];
    ll dp[MAX];
    
    int main()
    {
        scanf("%lld",&n);
        for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
        dp[0]=1;
        for(int i=1;i<=n;i++)
        {
            vector<ll>v;
            for(int j=1;j*j<=a[i];j++)
            {
                if(a[i]%j==0)
                {
                    v.push_back(j);
                    if(j*j!=a[i])
                        v.push_back(a[i]/j);
                }
            }
            sort(v.begin(),v.end());
            reverse(v.begin(),v.end());
            for(auto &it: v)
            {
                dp[it]+=dp[it-1];
                dp[it]%=mod;
            }
        }
        for(int i=1;i<=n;i++)
            ans+=dp[i];
        ans%=mod;
        printf("%lld
    ",ans);
        return 0;
    }
    View Code
  • 相关阅读:
    HIVE Group by、join、distinct等实现原理
    【1.3】shell基础——调试shell(sh -x)
    sql server无法显示请求的对话框,检索数据失败
    sql server索引操作
    sql server中的alter
    tempdb无法收缩。使用 DBCC FREESYSTEMCACHE 解决
    在从该备份集进行读取时,RESTORE 检测到在数据库 "CISDB" 中的页(0:0)上存在错误。系统断定检查已失败
    【1.2】shell基础——stty erase解决按backspace出现^H的情况
    【1.1】shell基本实践——密码输入三次错误则结束
    (5.3.7)数据库迁移——sql server备份文件的加密解密
  • 原文地址:https://www.cnblogs.com/Kissheart/p/10009712.html
Copyright © 2011-2022 走看看