标签:置换 mod work 数据 ide long getchar ret 颜色
给定一个\(n\)个点,\(n\)条边的环,有\(n\)种颜色,给每个顶点染色,问有多少种本质不同的染色方案,答案对\(10^9+7\)取模
注意本题的本质不同,定义为:只需要不能通过旋转与别的染色方案相同。
第一行输入一个\(t\),表示有\(t\)组数据
第二行开始,一共\(t\)行,每行一个整数\(n\),意思如题所示。
共\(t\)行,每行一个数字,表示染色方案数对\(10^9+7\)取模后的结果
5
1
2
3
4
5
1
3
11
70
629
\(n \leq 10^9\)\(,t \leq 10^3\)
\(\left(\begin{aligned}1 && 2 && 3 && 4 && \dots && n \\ \ a_1 && a_2 && a_3 && a_4 && \dots && a_n\end{aligned}\right)\)
\(\left(\begin{aligned}1 && 2 && 3 && 4 && \dots && n \\ \ 2 && 3 && 4 && 5 && \dots && 1\end{aligned}\right)\)
\(\left(\begin{aligned}1 && 2 && 3 && 4 && \dots && n \\ \ 3 && 4 && 5 && 6 && \dots && 2\end{aligned}\right)\)
\(\begin{aligned}ans=\frac 1 n \sum_{i=1}^n m^{x_i}\end{aligned}\)
\(\left(\begin{aligned}1 && 2 && 3 && 4 && 5 && 6\\ 4 && 5 && 6 && 1 && 2 && 3\end{aligned}\right)\)
\(\begin{aligned}ans=\frac 1 n \sum_{i=1}^n m^{gcd(i,n)}\end{aligned}\)
\(\begin{aligned}ans=\frac 1 n \sum_{d|n}^n \varphi(\frac n d)* m^{d}\end{aligned}\)
#include<bits/stdc++.h>
#define LL long long
LL in() {
char ch; LL x = 0, f = 1;
while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));
return x * f;
}
const int mod = 1e9 + 7;
LL ksm(LL x, LL y) {
LL re = 1LL;
while(y) {
if(y & 1) re = re * x % mod;
x = x * x % mod;
y >>= 1;
}
return re;
}
LL getphi(LL n) {
LL ans = n;
for(LL i = 2; i * i <= n; i++) {
if(n % i == 0) {
ans = ans / i * (i - 1);
while(n % i == 0) n /= i;
}
}
if(n != 1) ans = ans / n * (n - 1);
return ans;
}
LL work(LL n) {
LL ans = 0;
for(LL i = 1; i * i <= n; i++) {
if(n % i == 0) {
(ans += ksm(n, i) * getphi(n / i) % mod) %= mod;
if(i * i != n) (ans += ksm(n, n / i) * getphi(i) % mod) %= mod;
}
}
return ans * ksm(n, mod - 2) % mod;
}
int main() {
for(int T = in(); T --> 0;) printf("%lld\n", work(in()));
return 0;
}
标签:置换 mod work 数据 ide long getchar ret 颜色
原文地址:https://www.cnblogs.com/olinr/p/10359459.html