T5 Multiplicity (CF1061C)
T5 Multiplicity (CF1061C)
很基础的一个dp(为什么是紫题)
CF传送门
洛谷传送门
题意简述
从序列
题解
思路
显然是dp
发现条件是跟选出来的数列有关的
所以状态就要设计一个 选出来的数列长度
所以设
考虑从
可以不选第
也可以选,这时候就要求
所以状态转移方程
答案就是
做法
注意事项
· 别忘了取模
AC代码
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int mod=1e9+7;
int n,f[N],ans=0;
int main(){
scanf("%d",&n);
bool id=0;
f[0]=1;
for(int i=1;i<=n;i++){
int a;
scanf("%d",&a);
for(int j=max(a/n,1);j<=sqrt(a);j++){
if(a/j>n) continue;
if(a%j==0) f[a/j]=(f[a/j]+f[a/j-1])%mod;
}//枚举大于sqrt(n)的因数(从大到小)
for(int j=min(n,(int)sqrt(a));j>=1;j--){
if(a%j==0 && j*j!=a) f[j]=(f[j]+f[j-1])%mod;
}//枚举小于sqrt(n)的因数(从大到小)
}
for(int i=1;i<=n;i++) ans=(ans+f[i])%mod;//计算答案
printf("%d",ans);
}