小明的密钥
时间限制:
1000 ms | 内存限制:
32768 KB
难度:
5
-
描述
-
小明想出了一种新的编写密码的方法,给出一个公开密钥N=A^B(1<=A,B<=1000000),假定N的因子有 a[0], a[1], a[2], …, a[k-1],而a[0], a[1], a[2], …, a[k-1]的因子个数分别为t[0],t[1],t[2],…,t[k-1],那么他的私人密钥M为t[0],t[1],t[2],…,t[k-1]的立方和。现在需要你编写一个程序来帮小明实现由公开密钥转化为私人密钥的功能。
-
输入
-
有多组测试数据,每组测试数据有两个数A,B(1<=A,B<=1000000)。输入以文件结束为标志。
提醒:大约有50000个测试数据,注意你的计算方法能在给定的时间内完成该测试。
输出
- 每一组测试数据,输出M对10007求余后的的值。 样例输入
-
2 2 1 1 4 7
样例输出
-
Case 1: 36 Case 2: 1 Case 3: 4393
-
有多组测试数据,每组测试数据有两个数A,B(1<=A,B<=1000000)。输入以文件结束为标志。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int ss[1001]={1,1};
int f[200];
void db()
{
int i,j,k=0;
for(i=2;i<=1000;i++)
{
if(ss[i]==0)
{
f[k++]=i;
for(j=i+i;j<=1000;j+=i)
ss[j]=1;
}
}
}
int main()
{
long long a,b,k,n,m,sum,i,NO=1;
db();
while(~scanf("%lld%lld",&a,&b))
{
if(a==1)
{
printf("Case %lld: 1\n",NO++);
continue;
}
k=0;
sum=1;
for(i=0;i<168;i++)
{
n=m=0;
if(sqrt(1.0*a)<f[i]) break;
while(a%f[i]==0)
{
n++;
a=a/f[i];
}
n=n*b+1;
m=(n*(n+1)/2)%10007;
sum=sum*m*m%10007;
k++;
if(a==1) break;
}
if(a>1)
{
n=b+1;
m=(n*(n+1)/2)%10007;
sum=sum*m*m%10007;
}
printf("Case %lld: ",NO++);
printf("%lld\n",sum);
}
}