D2. Up the Strip(递推)
Posted Harris-H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了D2. Up the Strip(递推)相关的知识,希望对你有一定的参考价值。
D2. Up the Strip(递推)
考虑如何从 f i − 1 → f i f_{i-1}\\rightarrow f_i fi−1→fi。
显然操作1多了 f i − 1 f_{i-1} fi−1,操作二多了 f 1 f_1 f1。
所以 f i = 2 f i − 1 + 1 f_i=2f_{i-1}+1 fi=2fi−1+1。
除此外,所有 i i i的因数都会相对于 ( i − 1 ) (i-1) (i−1)加1,因为
e p : i = 4 , 4 2 = 2 , ( 4 − 1 ) 2 = 1 ep: i=4,\\dfrac{4}{2}=2,\\dfrac{(4-1)}{2}=1 ep:i=4,24=2,2(4−1)=1。
所以就类似素数筛,更新一下即可。
注意 f 2 f_2 f2特判。
时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
int n,m;
ll f[N];
int main(){
scanf("%d%d",&n,&m);
f[1]=1;
for(int i=2;i<=n;i++){
if(i==2) f[i]=2;
else {
f[i]=(f[i]+2*f[i-1]+1)%m;
}
ll x=f[i]-f[i-1];
for(int j=2*i;j<=n;j+=i) f[j]+=x;
}
printf("%lld\\n",(f[n]%m+m)%m);
return 0;
}
以上是关于D2. Up the Strip(递推)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #740 (Div. 2) D1. Up the Strip (simplified version)
Codeforces Round #740 (Div. 2) D1. Up the Strip (simplified version)
整除分块前缀和DPD. Up the Strip(简单版 + 正常版)