一开始和队友想出来的式子,
p
i
p_i
pi是
i
i
i的因子数组
a
n
s
[
i
]
=
∑
i
=
1
k
a
n
s
[
(
i
−
p
i
)
/
p
i
]
ans[i] = \sum_{i=1}^{k} ans[(i-p_i)/p_i]
ans[i]=∑i=1kans[(i−pi)/pi]
一个
O
(
n
n
)
O(n\sqrt n)
O(nn)的dp显然是过不了的
然后想到了对每个数枚举倍数预处理因子的话计算的话,时间复杂度是
O
(
n
l
n
n
)
O(nlnn)
O(nlnn),因为是
n
i
+
n
i
+
1
+
.
.
.
.
+
n
n
\frac{n}{i}+\frac{n}{i+1}+....+\frac{n}{n}
in+i+1n+....+nn约等于
n
l
n
n
nlnn
nlnn
发现还是TLE,STL常数太大了,队友突然想到可以直接算
设当前数字是
i
i
i,枚举倍数
j
j
j,
a
n
s
[
i
∗
j
]
=
a
n
s
[
(
i
∗
j
−
j
)
/
j
]
=
a
n
s
[
i
−
1
]
ans[i*j] = ans[(i*j-j)/j]=ans[i-1]
ans[i∗j]=ans[(i∗j−j)/j]=ans[i−1],
a
n
s
[
i
−
1
]
ans[i-1]
ans[i−1]已经算过了,可以进行转移,另外特殊处理因子是
i
i
i本身的情况,
+
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