kuangbin 数论 E题

来源:互联网 发布:c语言成员变量 编辑:程序博客网 时间:2024/06/03 11:56

此题不会前三位 参考:http://blog.csdn.net/lxpaopao/article/details/45417489
题意:给你一个数n,让你求这个数的k次方的前三位和最后三位
思路:求最后的三位,可以通过直接取余得到;求前三位则需要一些数学知识对于给定的一个数n,它可以写成10^a,其中这个a为浮点数,则n^k=(10^a)^k=10^a*k=(10^x)*(10^y);其中x,y分别是a*k的整数部分和小数部分对于t=n^k这个数,它的位数由(10^x)决定,它的位数上的值则有(10^y)决定,因此我们要求t的前三位,只需要将10^y求出,在乘以100,就得到了它的前三位。
fmod(x,1)可以求出x的小数部分。

推导:

x=lg(n^k)--->k*lg(10^n)=a+b-->10^a*10^b=n^k-->a+b=klgn-->x=klogn  

10^a整数位是n^k的位数,10^b小数位是n^k个位数上的值,我们求出小数位上的值,乘以100即可。
学习了一个函数
fmod(x,1)可以求出x的小数部分。

代码:

#include <bits/stdc++.h>using namespace std;const int mod=1000;int pow_mod(int a,int n){//取模,求后三位    if(n==1) return a%mod;    long long t=pow_mod(a,n/2);    long long ans=t*t%mod;    if(n%2==1) ans=ans*a%mod;    return ans;}int main(){    int T,k,n,kase=1;    cin>>T;    while(T--)    {        scanf("%d%d",&n,&k);        int x = (int)pow(10.0,2.0+fmod(k*log10(1.0*n),1));        int y = pow_mod(n,k);        printf("Case %d: %d %03d\n",kase++,x,y);    }    return 0;}