本题是一道快速幂的题目,但不同于一般的快速幂,此快速幂需要结合到高精度,因为题干条件里写了n的位数最高有两百位,可见不开高精度的话肯定是过不了的。
所以用一个数组来保存n,再编写一个子程序用于对n进行除2的操作,再加以一个快速幂。
代码如下
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n[300];
/*void bc(){
cin>>b;
int a=2011;
while(b>0){
if(b%2==1) ans=ans*a%c;
b/=2;
a=a*a%c;
}
cout<<ans<<endl;
} */
void chu2(){
int y=0;
bool flag=false;
n[1]-=n[1]%2;
for(int i=n[0];i>=1;i--){
if(n[i]%2==1){
flag=true;
n[i]-=1;
} else flag=false;
n[i]=n[i]/2+y;
if(flag) y=5; else y=0;
}
if(n[n[0]]==0) n[0]--;
}
void quickm(int a,int ans){
if(n[0]<=0) cout<<ans<<endl;
else{
if(n[1]%2==0) {chu2();quickm(a*a%10000,ans);}
else {chu2();quickm(a*a%10000,ans*a%10000);}}
return;
}
int main(){
string s;
int t;
cin>>t;
while(t--){
memset(n,0,sizeof(n));
cin>>s;
n[0]=s.length();
for(int i=1;i<=n[0];i++){
n[i]=s[n[0]-i]-'0';
}
quickm(2011,1);
}
return 0;
}