n个点,然后n个边的环,n种颜色本质不同染色方案
考虑先找到旋转i次的等价类
不难发现为 gcd ( i , n ) \gcd(i,n) gcd(i,n),原因是我们旋转 i i i次1会到 i + 1 i+1 i+1,也就是说我们有一个大小为 n / gcd n/\gcd n/gcd的轨道!然后就会发现总共的轨道数就是 gcd \gcd gcd个
那么考虑每种作用下的不动点个数就是 gcd ( i , n ) \gcd(i,n) gcd(i,n),根据polya定理,答案就是 ∑ i = 1 n k g c d ( i , n ) n \frac{\sum_{i=1}^{n}k^{gcd(i,n)}}{n} n∑i=1nkgcd(i,n)
对于这个问题我们可以大胆的反演!
∑
d
=
1
n
k
d
∑
i
[
g
c
d
(
i
,
n
)
=
=
d
]
\sum_{d=1}^{n}k^{d}\sum_i [gcd(i,n)==d]
d=1∑nkdi∑[gcd(i,n)==d]
∑ d ∣ n k d ∑ i n d [ ( i , n ) = = 1 ] \sum_{d|n}k^d\sum_{i}^{\frac{n}{d}}[(i,n)==1] d∣n∑kdi∑dn[(i,n)==1]
得到
1 n ∑ d ∣ n n d ϕ ( n d ) \frac{1}{n}\sum_{d|n}n^d\phi(\frac{n}{d}) n1∑d∣nndϕ(dn)
NOI2021观摩团!
我写了个 n 3 / 4 ∗ T n^{3/4}*T n3/4∗T的,可以预处理质数除掉一个 log \log log
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int P=1e9+7;
const int MAXN=1e6+7;
int t,n;
inline ll ksm(ll x,ll y) {
ll ans=1;
while(y) {
if(y&1)ans=ans*x%P;
x=x*x%P;
y>>=1;
}
return ans;
}
inline ll getphi(int x) {
ll ret=1;
for(ll i=2; i*i<=x; ++i) {
if(x%i==0) {
ret=ret*(i-1);
x/=i;
while(x && x%i==0) {
x/=i;
ret=ret*i;
}
}
}
if(x>1)
ret=ret*(x-1);
return ret;
}
int main() {
scanf("%d",&t);
while(t-->0) {
scanf("%d",&n);
ll ans=0;
for(ll i=1; i*i<=n; ++i) {
if(n%i==0) {
ans=(ans+ksm(n,i)%P*getphi(n/i)%P)%P;
if(i*i!=n)ans=(ans+ksm(n,n/i)%P*getphi(i)%P)%P;
}
}
ans=ans*ksm(n,P-2)%P;
printf("%lld\n",ans);
}
return 0;
}