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.

扫描二维码关注公众号,回复: 4201900 查看本文章

题意

  给一个序列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\n",ans);
    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/Kissheart/p/10009712.html