hdu 3049 Data Processing

来源:互联网 发布:国际阿里云开通流程 编辑:程序博客网 时间:2024/06/11 10:31

http://acm.hdu.edu.cn/showproblem.php?pid=3049


//这题简单一点说就是求 A/B%P

//由 B*B~ = kP +1; B~ 是B关于P的逆元;B~ = (kP + 1)/B
//所以 A*B~ = A*(kP + 1)/B = P*k(A/B) + A/B;

//当A整除B时有:A/B%P = A*B~%P



#include<iostream>
using namespace std;


//求b关于a的逆元
int mulinv(int b,int a)//求一个整数b对a的乘法逆元 
{
    int x1,x2,x3;
    int y1,y2,y3;
    int t1,t2,t3;
    x1=1;
    x2=0;
    x3=a;
    y1=0;
    y2=1;
    y3=b;
    int k;
    for(t3=x3%y3;t3!=0;t3=x3%y3)
{
        k=x3/y3;
        t2=x2-k*y2;
        t1=x1-k*y1;
        x1=y1;
        x2=y2;
        x3=y3;
        y1=t1;
        y2=t2;
        y3=t3;
    }  
    if(y2<0)
        y2+=a;
    if(y3==1)
        return y2;
    else 
        return 0;
}


__int64 modular(__int64 b,__int64 n,__int64 m)//求同余幕  
{  
    __int64 x=1,power=b%m;  
    __int64 temp=n;  
    int a[65];  
    int k=0,i;  
    while(temp>0)  
    {  
        a[k++]=temp%2;  
        temp/=2;  
    }  
    for(i=0;i<k;i++)  
    {  
        //printf("%d\n",a[i]);  
        if(a[i]==1)  
            x=(x*power)%m;  
        power=(power*power)%m;  
    }  
    return x;  
}  


int main()
{
int N,P = 1000003;
int T;
int cases = 0;
int nk,i;
__int64 mod;
__int64 mod1;
scanf("%d",&T);
getchar();
while(T--)
{
cases++;
mod = 0;
scanf("%d",&N);
for(i = 0;i<N;i++)
{
scanf("%d",&nk);
mod1 = modular(2,nk,P);
mod = (mod+mod1)%P;
}
// printf("%I64d\n",mulinv(N,P));
mod = (mulinv(N,P)*mod)%P;
printf("Case %d:%I64d\n",cases,mod);
}
return 0;
}