传送门
现场没推出来,找了个规律,发现是 (n+1)n−1 就直接冲过了
【分析】
考虑 0≤k<n ,所以 min(k,n−1)=k
因此有:
====i=k∑min(k,n−1)+n−1k+1lcm(i−k+1,n)i=1∑nk+1lcm(i,n)k+11i=1∑ngcd(i,n)ink+11⋅n⋅g∣n∑g1i=1∑n[gcd(i,n)=g]ik+1n⋅g∣n∑i=1∑gn[gcd(i,gn)=1]i
而其中,不超过 x 的与 x 互质的数和,是经典题目,有:
s(m)=====i=1∑m[gcd(i,m)=1]id∣m∑μ(d)i=1∑m[d∣i]id∣m∑μ(d)⋅d⋅2dm⋅(dm+1)2m(d∣m∑μ(d)⋅dm+d∣m∑μ(d))2m⋅(φ(m)+[m=1])
于是给定式子化简为 k+11⋅n⋅g∣n∑s(g) 。除了 k+11 显然可以通过枚举倍数的方法,在 O(i=1∑nin)=O(nlogn) 的时间内预处理
剩余的部分考虑组合意义:
n 种字符中,有 k 个从未使用,构成长度为 n 的字符串方案数
等价于从 n 个互不相同的盒子中选择 n−k 个,然后将 n 个小球放入这 n−k 个互不相同的盒子,要求每个选定的盒子非空,问方案数
考虑第二类斯特林数的组合意义,不难写出公式 (n−kn)⋅{nn−k}⋅(n−k)!
于是答案为:
==k=0∑n−1(n−kn)⋅{nn−k}⋅(n−k)!⋅k+11⋅n⋅g∣n∑s(g)(k=1∑n(kn)⋅{nk}⋅k!⋅n−k+11)⋅(n⋅g∣n∑s(g))(k=0∑n−1(n−k)!n!⋅{nk+1})⋅(n⋅g∣n∑s(g))
考虑第二类斯特林数和下降幂的关系有:
===k=0∑n−1(n−k)!n!⋅{nk+1}n+11k=1∑n{nk}(n+1)kn+11⋅[(n+1)n−{n0}](n+1)n−1(n>0)
于是直接冲就完事了
【代码】
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int P=998244353;
inline int kpow(int a, int x, int p=P) { int ans=1; for(; x; x>>=1, a=(ll)a*a%p) if(x&1) ans=(ll)ans*a%p; return ans; }
inline int inv(int a, int p=P) { return kpow(a, p-2, p); }
const int Lim=1e6, MAXN=Lim+10;
int n, phi[MAXN], f[MAXN];
int prime[MAXN], cntprime, fc[MAXN];
inline void init() {
phi[1]=1;
for(int i=2; i<=Lim; ++i) {
if(!fc[i]) fc[i]=prime[++cntprime]=i, phi[i]=i-1;
for(int j=1; j<=cntprime; ++j)
if(prime[j]>fc[i]||prime[j]*i>Lim) break;
else {
fc[prime[j]*i]=prime[j];
phi[prime[j]*i]=(fc[i]==prime[j]?prime[j]:prime[j]-1)*phi[i];
}
}
for(int i=1; i<=Lim; ++i) {
int s=(i==1?1:(ll)i*phi[i]/2%P);
for(int j=i; j<=Lim; j+=i)
f[j]=(f[j]+s)%P;
}
for(int i=1; i<=Lim; ++i) f[i]=(ll)i*f[i]%P;
}
inline int ans() {
cin>>n;
return (ll)f[n]*kpow(n+1, n-1)%P;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
init();
int T;
cin>>T;
while(T--)
cout<<ans()<<"\n";
return 0;
}