E - 后四位
作者:互联网
#include<bits/stdc++.h> using namespace std; long long n,a[1000001],t,cnt,x,y; int main() { cin.tie(0); ios::sync_with_stdio(false); cin>>t; for (int p=1;p<=t;p++){ cin>>x>>y; memset(a,0,sizeof(a)); cnt=0; while(y!=0) { cnt++; a[cnt]=y%2; y=y/2; } //b 化为 2阶 long long ans=1,tmp=1; x%=10000; tmp=x; for (int i=1;i<=cnt;i++) { if (a[i]!=0) ans*=tmp; tmp=tmp%10000; ans=ans%10000; tmp*=tmp; } if (ans>=1000) cout<<ans<<endl; else if (ans>=100) cout<<"0"<<ans<<endl; else if (ans>=10) cout<<"00"<<ans<<endl; else cout<<"000"<<ans<<endl; } return 0; }
很遗憾,我不会在前位补0,
不过还好。我现场学了一发。
对于某个数的大数的平方。两个数都很大很大。
那么,就把指数二进制化。%2 进栈 /2直到为0为止。
再从后往前乘。
做法如下
假如指数是21
(10101)2
倒过来是
10101(<-真巧
假如底数是n
答案就是:
2的0次方(1)乘以底数……(A)
2的2次方(4)乘以底数……(B)
2的4次方(16)乘以底数……(C)
A*B*C;
即可
而B是A*2*2得出的,C是B*2*2得出的。 也就是说,在循环的不同时段里,ABCD……可以用一个tmp来存
所以A式到C式求解只需要走一次。(往后滚一边)
在滚的过程中,将我们的sum顺便乘以下tmp。
やったぜ!
标签:tmp,cnt,cout,int,底数,long,四位 来源: https://www.cnblogs.com/asanagiyantia/p/11679851.html