hdu 3923
题目大意:给定m种颜色,长度为n的项链,要求旋转和翻转不能重复,求方法数 ;
模板题 + 逆元;
#include <iostream>
#include <cstdio>
#define LL long long
#define MOD 1000000007
using namespace std;
LL gcd(LL a, LL b)
{
return b == 0 ? a : gcd(b, a % b);
}
LL quick_Mod(LL m, LL n, LL k)
{
LL ans = 1;
while (n)
{
if (n & 1)
{
ans = (ans * m) % k;
}
n = n >> 1;
m = (m * m) % k;
}
return ans;
}
int main()
{
int T;
scanf("%d", &T);
for (int cas = 1; cas <= T; cas++)
{
LL m, n;
scanf("%lld%lld", &m, &n);
LL sum = 0;
for (int i = 1; i <= n; i++)
{
LL t = gcd(i, n);
sum = (sum + quick_Mod(m, t, MOD));
}
if (n & 1)
{
sum = (sum + quick_Mod(m, (n + 1) / 2, MOD) * n % MOD) % MOD;
}
else
{
sum = (sum + n / 2 * quick_Mod(m, (n + 2) / 2, MOD) % MOD) % MOD;
sum = (sum + n / 2 * quick_Mod(m, n / 2, MOD) % MOD) % MOD;
}
sum = sum * quick_Mod(2 * n, MOD - 2, MOD) % MOD;
printf("Case #%d: %lld\n", cas, sum);
}
return 0;
}