题目链接:点我点我
题意:给n,k,求nk的前三位和后三位。
题解:后三位直接快速幂。前三位的话,我们假设n=10a,nk=10a*k=10x+y=10x * 10y。
我们把10x当做位数(就是让他它尽可能大,比如n的k次方为12345,10x就相当于104),10y当做表示的值(12345这个数,它的10y就是1.2345)。
我们把这个10y求出来就可以了,最后再乘上100,强制转换一下,就得到前三位了。但是要怎么求呢。这就要用到之前的公式:
nk=10x+y <=> k*log10 n=x+y,因为这时候的y是个小数(就比如说10y是1.2345,y取值显然是 0<y<1),y=double(k*log10 n)- LL(k*log10 n)。
y都求出来了,最后再处理一下就可以了。注意:没有三位的要加前导0.
1 #include <cmath> 2 #include <cstdio> 3 using namespace std; 4 5 typedef long long LL; 6 LL fast_mod(LL x,LL n,LL mod){ 7 LL ans=1; 8 while(n>0){ 9 if(n&1) ans=(ans*x)%mod; 10 x=(x*x)%mod; 11 n>>=1; 12 } 13 return ans; 14 } 15 16 int main(){ 17 LL t,n,k,Case=1; 18 scanf("%lld",&t); 19 while(t--){ 20 scanf("%lld %lld",&n,&k); 21 double x=1.0*k*log10(n*1.0); 22 x=x-LL(x); 23 LL y=fast_mod(n,k,1000); 24 printf("Case %lld: %03lld %03lld\n",Case++,(LL)(pow(10,x)*100),y); 25 } 26 return 0; 27 }
时间: 2024-12-23 19:36:27