我住包子山

this->blog.MoveTo("blog.baozishan.in")

一个小练习,帮人做 (a^n)%k

输入a,n,k(1<=a,n<=1e9   1<=k<=10000 ,注意:有多组测试数据,请用EOF标志判断结束输入):
2 32 5
2 30 5

输出(a^n)%k的结果(a的n次方被k除的余数):
输入a,n,k(1<=a,n<=1e9   1<=k<=10000 ,注意:有多组测试数据,请用EOF标志判断结束输入):
2 32 5
2 30 5

输出(a^n)%k的结果(a的n次方被k除的余数):
要求复杂度为O(logn)

解决思路,吃屎兄的推导的
(a*b)Mod c=((a Mod c)*b)Mod c
a^b Mod c  把B写成二进制(At ,At-1,At-2...A1,A0)
a^b Mod c =(a^(At*2^t....A0*2^0)mod c)=

((a^A0*2^0 mod c)*a^A1*2^1mod c).....
t=log2B;

下面是小弟的程序

#include <iostream>
using namespace std;
int convertToBin(int n,int (&arr)[14])
{
    
int i=0;
    
while(n)
    
{
        arr[i]
=n%2;
        n
=n/2;
        i
++;
    }

    
return i;
}

int findAnswer(int k,int a,int arr[14],int bsize)
{
    
int ret = 1;
    
for(int i=0;i<bsize;i++)
    
{
        
if(arr[i])
            ret
=(ret*a*(1<<i))%k;
        
else
            ret
=(ret*(1<<i))%k;
    }

    
return ret;
}

int main()
{
    
int a,n,k=1;
    
while(!cin.eof())
    
{
        cin
>>a;
            
if(a==-1break;
        cin
>>n>>k;
        
int arr[14]={0};
        
int bsize = convertToBin(n,arr);
        cout
<<findAnswer(k,a,arr,bsize)<<endl;
    }

}

posted on 2007-06-01 22:49 Gohan 阅读(266) 评论(0)  编辑 收藏 引用 所属分类: Practise


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理