杭州网络预赛1004 Deciphering Password
真糟糕,被%耍了一晚多写两个就超时了……真不应该到现在才来把这题干掉
#include <iostream>
using namespace std;
#define MAXN 1001
__int64 a,b;
int prim[MAXN],pcnt;
bool is_prim[MAXN];
void prepare(){
memset(is_prim,true,sizeof(is_prim));
pcnt=0;
__int64 i,j;
for(i=2;i<MAXN;i++){
if(is_prim[i]){
for(j=i;i*j<MAXN;j++)
is_prim[i*j]=false;
prim[pcnt++]=i;
}
}
}
int main(){
__int64 i,j,k,ans,tt,T=1;
prepare();
while(scanf("%d%d",&a,&b)!=EOF){
ans=1;
b%=10007;//( j * b + 1) %10007 = ( j % 10007 * b % 10007 % 10007 + 1 ) % 10007
for(i=0;i<pcnt && prim[i]*prim[i]<=a && a!=1;i++){
for(j=0;a%prim[i]==0;j++)
a/=prim[i];
tt=(j*b+1)*(j*b+2)/2%10007;//立方和公式
tt*=tt;
ans=ans*tt%10007;
}
if(a!=1){
tt=(b+1)*(b+2)/2%10007;
tt*=tt;
ans=ans*tt%10007;
}
printf("Case %I64d: %I64d\n",T++,ans);
}
return 0;
}
using namespace std;
#define MAXN 1001
__int64 a,b;
int prim[MAXN],pcnt;
bool is_prim[MAXN];
void prepare(){
memset(is_prim,true,sizeof(is_prim));
pcnt=0;
__int64 i,j;
for(i=2;i<MAXN;i++){
if(is_prim[i]){
for(j=i;i*j<MAXN;j++)
is_prim[i*j]=false;
prim[pcnt++]=i;
}
}
}
int main(){
__int64 i,j,k,ans,tt,T=1;
prepare();
while(scanf("%d%d",&a,&b)!=EOF){
ans=1;
b%=10007;//( j * b + 1) %10007 = ( j % 10007 * b % 10007 % 10007 + 1 ) % 10007
for(i=0;i<pcnt && prim[i]*prim[i]<=a && a!=1;i++){
for(j=0;a%prim[i]==0;j++)
a/=prim[i];
tt=(j*b+1)*(j*b+2)/2%10007;//立方和公式
tt*=tt;
ans=ans*tt%10007;
}
if(a!=1){
tt=(b+1)*(b+2)/2%10007;
tt*=tt;
ans=ans*tt%10007;
}
printf("Case %I64d: %I64d\n",T++,ans);
}
return 0;
}
请见:积性函数