杭州网络预赛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 != 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 ;
}

 

请见:积性函数

你可能感兴趣的:(password)