您的位置:首页 > 其它

【HDU】3923 Invoker

2012-09-12 21:48 363 查看
【POJ】2409 Let it Bead

只不过要求逆元。

#include<cstdio>
typedef long long LL;
#define MOD 1000000007
LL PowMod(LL a, LL b, LL c) {
LL ans;
a %= c;
for (ans = 1; b; b >>= 1) {
if (b & 1) {
ans *= a;
ans %= c;
}
a *= a;
a %= c;
}
return ans;
}
int GCD(int x, int y) {
return y ? GCD(y, x % y) : x;
}
int ExtGcd(int a, int b, int &x, int &y) {
int t, d;
if (b == 0) {
x = 1;
y = 0;
return a;
}
d = ExtGcd(b, a % b, x, y);
t = x;
x = y;
y = t - a / b * y;
return d;
}
int InvMod(int a, int n) {
int x, y;
ExtGcd(a, n, x, y);
return (x % n + n) % n;
}
int main() {
int c, ca = 1;
int n, i, k;
LL ans;
scanf("%d", &c);
while (c--) {
scanf("%d%d", &k, &n);
ans = 0;
for (i = 1; i <= n; i++) {
ans += PowMod(k, GCD(n, i), MOD);
ans %= MOD;
}
if (n & 1) {
ans += PowMod(k, (n + 1) >> 1, MOD) * (LL) n % MOD;
ans %= MOD;
} else {
ans += PowMod(k, n >> 1, MOD) * (LL) (n >> 1) % MOD;
ans += PowMod(k, (n >> 1) + 1, MOD)
* (LL) (n >> 1)% MOD;
ans %= MOD;
}
printf("Case #%d: %I64d\n", ca++,
ans * InvMod(n << 1, MOD) % MOD);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: