B. Up the Strip
考虑dp
dp[i]表示当前i位置的cnt
考虑转移
我们对于第一个操作显然只用维护一个后缀和即可
dp[i]+=s[i+1]
对于第二个操作 也很简单
我们知道i的值
z除一个数j下取整等于i
z的范围就是 [ij,ij+j)
然后我们就会发现这是一个调和级数
最后还要注意的就是 这里的后缀和是小的减大的 大的本来后面要+1 但是和 -1抵消了 还有不能越界
void solve(){
int n,m;cin>>n>>m;
vector<int>dp(n+10),s(n+10);
dp[n]=1;
for(int i=n;i>=1;i--){
for(int j=2;j*i<=n;j++)
(dp[i]+=s[i*j]-s[min(n+1,i*j+j)])%=m;
(dp[i]+=s[i+1])%=m;
(s[i]=s[i+1]+dp[i])%=m;
}
cout<<dp[1]<<endl;
}
标签:740,Engine,based,Cup,int,Codeforces,ij,dp
From: https://www.cnblogs.com/ycllz/p/16871890.html