一开始和队友想出来的式子,pip_ipi是iii的因子数组
ans[i]=∑i=1kans[(i−pi)/pi]ans[i] = \sum_{i=1}^{k} ans[(i-p_i)/p_i]ans[i]=∑i=1kans[(i−pi)/pi]
一个O(nn)O(n\sqrt n)O(nn)的dp显然是过不了的
然后想到了对每个数枚举倍数预处理因子的话计算的话,时间复杂度是O(nlnn)O(nlnn)O(nlnn),因为是ni+ni+1+....+nn\frac{n}{i}+\frac{n}{i+1}+....+\frac{n}{n}in+i+1n+....+nn约等于nlnnnlnnnlnn
发现还是TLE,STL常数太大了,队友突然想到可以直接算
设当前数字是iii,枚举倍数jjj,ans[i∗j]+=ans[(i∗j−j)/j]+=ans[i−1]ans[i*j] += ans[(i*j-j)/j] +=ans[i-1]ans[i∗j]+=ans[(i∗j−j)/j]+=ans[i−1], ans[i−1]ans[i-1]ans[i−1]已经算过了,可以进行转移,另外特殊处理因子是iii本身的情况,+1+1+1即可
#include <bits/stdc++.h>
using namespace std;
const int mod = 998244353;
int n;
long long ans[1000100];
int main() {
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;
for(int i = 1;i<=1e6;++i){
ans[i]+=1;
for(int j = 1;j<=1e6/(i+1);++j){
ans[(i+1)*j]=(ans[(i+1)*j]+ans[i])%mod;
}
}
for(int i = 1;i<=n;++i) cout<<ans[i]%mod<<" ";
return 0;
}
太菜啦QAQ,少用STL