对a和b拆解,
例如a=7
a=
例如b=5
b=
相乘时
a x b==
=
只需要对各个项的上标进行计算即可;
计算可能会很大,但是n不会特别大,所以可以转变成n个2连乘,每次乘2都mod p就不会溢出。
#include"stdio.h"
long long power(long long b,long long p);
int main()
{
long long a=0L;
long long b=0L;
long long p=0L;
long long ans=0L;
long long t=1L;
int i=0,j,k=0,k1=0;
int m1[100];//存b的二进制的每一项2的上标 比如7的2进制(111=1*2^0+1*2^1+1*2^2)上标0 1 2 即2的0次方,2的1次方,2的2二次方
int m2[100];//存a的二进制的每一项2的上标
scanf("%lld",&a);
scanf("%lld",&b);
scanf("%lld",&p);
while(b>0)
{
if(b&1)
{
m1[k++]=i;
}
i++;
b=b>>1;
}
/**
for(j=0;j<k;j++)
{
printf("%d ",m1[j]);
}
printf("\n");
*/
t=1L;
ans=0L;
i=0;
while(a>0)
{
if(a&1)
{
m2[k1++]=i;
}
i++;
a=a>>1;
//printf("%lld %d\n",ans,m2[i-1]);
}
/*
for(j=0;j<k1;j++)
{
printf("%d ",m2[j]);
}
printf("\n");
*/
ans=0L;
for(i=0;i<k;i++)
{
for(j=0;j<k1;j++)
{
ans+=power(m1[i]+m2[j],p);
ans=ans%p;
}
}
printf("%lld ",ans);
//printf("\n");
// printf("%lld ",power(2,10));
}
long long power(long long b,long long p)
{
int i=0;
long long a=1;
for(i;i<b;i++)
{
a=a*2%p;
}
return a;
}