1234:2011
假定三个2011相乘,取出前两个2011相乘的结果后四位与第三个2011相乘并对结果取后四位即为最终结果。
看到这是不是就想循环求解?
让我来滋醒你,200位的循环次数,不爆是不可能的!
而使用分治,200位大概等于2700,也就是说最多700轮分治左右(这里不算特殊情况20111)。
所以,奔向分治的怀抱吧!骚年!
当然,对于每轮的分治处理还是蛮多的。
包括大整数除2、每次取结果的后四位等。
具体实现就在代码里,自己看吧!(`へ´*)ノ
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 typedef long long ll; 6 const int N=205; 7 int ans,a[N]; 8 char cc[N]; 9 int getFour(ll v,int a3){ 10 int ans=0,m=1000; 11 v*=a3; 12 while(m){ 13 ans=ans*10+v/m%10; 14 m/=10; 15 } 16 return ans; 17 } 18 void divideTwo(int x[],int y[]){ 19 int t=0,st=1,len=1; 20 if(x[1]==1){ 21 st=2;t=1; 22 } 23 for(int i=st;i<=x[0];i++){ 24 t=t*10+x[i]; 25 y[len++]=t/2; 26 t%=2; 27 } 28 y[0]=len-1; 29 } 30 int dac(int t[]){ 31 if(t[0]==1&&t[1]==1)return 2011; 32 int x[N]; 33 divideTwo(t,x); 34 int a1=dac(x),a2=1; 35 if(t[t[0]]%2)a2=2011; 36 return getFour(a1*a1,a2); 37 } 38 int main(){ 39 int k; 40 cin>>k; 41 while(k--){ 42 scanf("%s",cc); 43 // memset(a,0,sizeof(a)); 44 a[0]=strlen(cc); 45 for(int i=1;i<=a[0];i++) 46 a[i]=cc[i-1]-'0'; 47 cout<<dac(a)<<endl; 48 } 49 return 0; 50 }