1234:2011

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 }

 

posted @ 2021-08-11 17:38  Rekord  阅读(592)  评论(0编辑  收藏  举报