雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

快速幂乘法——SGU 117Counting

Posted on 2011-04-10 10:28  huhuuu  阅读(239)  评论(0编辑  收藏  举报
如将50倍化为二进制110010
对应32 16 8 4 2 1 
就是50是由32+16+2组成(加法)
而推广到乘法里2^50=(2^32)*(2^16)*(2^2)=2^(32+16+2)
View Code
#include<stdio.h>

int main()
{
int n,m,k;
scanf(
"%d%d%d",&n,&m,&k);
int i,add=0,t,j;
for(i=1;i<=n;i++)
{
__int64 all,rall
=1;
scanf(
"%d",&t);
all
=t;
int count=0;
for(j=1;j<=m;j=j*2)
{
if(j==1)
all
=t;
else
all
=all*all;
if(m&(1<<count))
{
rall
=rall*all;
if(rall%k==0)
{
add
++;
break;
}
rall
=rall%k;
}
all
=all%k;
count
++;
}
}
printf(
"%d\n",add);
}