3114: Uva12546 Lcm Pair Sum
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 95 Solved: 53
[ Submit][ Status][ Discuss]
Description
给定一个数N,求所有满足最小公倍数为N的a,b的和对1000000007取模.
例如当N=6时,有如下对数(1,6),(2,6),(2,3),(3,6),(6,6),其和为=(1+6)+(2+6)+(2+3)+(3+6)+(6+6)=7+8+5+9+12=41。
现在给你N的分解质因数式,请你求出相应的值。
Input
多组测试数据。第一行T表示数据组数。
每组数据第一行为M,表示有M的质因子。
下面M行,每行两个数,第一行为这个质因子,第二行为这个质因子在N中出现的次数。
Output
T行,每行一个整数表示f(N)的值。因为答案可能很大,所以只需输出答案 mod 1000000007。
Sample Input
3
2
2 1
3 1
2
2 2
3 1
1
5 1
Sample Output
Case 1: 41
Case 2: 117
Case 3: 16
如果要满足LCM(x, y)=n,n=z^3(z为质数),那么x和y中一定要有一个是z^3
设n=∏ai^ci,那么可以暴力所有的ai次幂,然后算出它对答案的贡献
如果不是满次幂(幂次不为ci)那么另一个数一定要是ai^ci的倍数,
如果是满次幂,那么右边那个数不受ai次幂限制,可以推出答案是
#include<stdio.h>
#define LL long long
#define mod 1000000007
int main(void)
{
LL now, sum, m, ans;
int T, i, n, a, b, j, cas = 1;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
ans = m = 1;
for(i=1;i<=n;i++)
{
scanf("%d%d", &a, &b);
now = sum = 1;
for(j=1;j<=b;j++)
{
now = now*a%mod;
sum = (now+sum)%mod;
}
sum = (sum+b*now)%mod;
m = m*now%mod;
ans = ans*sum%mod;
}
ans = (ans+m)%mod;
printf("Case %d: %lld\n", cas++, ans);
}
return 0;
}