题目链接:http://acm.tju.edu.cn/toj/showp.php?pid=2218
题目大意:给一个正整数N,输出N个N相乘对2006取余
思路:直接code 超时,所以 得上分治法:一半一半乘 并且!!若要求乘积是取余的结果 则因子和积都要取余
代码:
//分治法
#include <iostream>
using namespace std;
int n,sum;
int cal(int a, int n) //n个a相乘的结果对某数取余的模板 若要求乘积是取余的结果 则因子和积都要取余
{
if(n==1) return a;
sum = cal(a,n/2);
sum = (sum%2006)*(sum%2006)%2006;
if(n%2)
sum = (sum%2006)*(a%2006)%2006; //奇数个a的话 当然要用一个a单独乘了
return sum;
}
int main()
{
while(cin>>n &&n)
{
cout<<cal(n,n)<<endl;
}
return 0;
}