LightOJ 1282 Leading and Trailing

来源:互联网 发布:java list 自定义排序 编辑:程序博客网 时间:2024/05/17 01:16

题意:给出n和k,求n^k的前三位和后三位

解题思路:快速幂. n^k=a.bc*10^m,abc就是前三位,两边同时取lg,lg n^k=lg(a.bc*10^m),k*lg n=lg(a.bc)+m,所以m就是k*lg n的整数部分,lg(a.bc)就是k*lg n的小数部分,令p=lg(a.bc)=k*lg n-m=k*lg n-(int)(k*lg n),所以a.bc=10^p,前三位abc=a.bc*100,后三位就用n^k mod 10^3求出,求后三位用快速幂,这里要注意求出的后三位如果不满三位的话要加前导0

这类快速幂的题前m位用lg来求,后m位就用n^k mod 10^m来求

代码:

#include <iostream>#include <algorithm>#include <cstring>#include <string>#include <cstdio>#include <cmath>using namespace std;typedef long long ll;ll mod_pow(ll x,ll n,ll mod){    ll res=1;    while(n>0)    {        if(n&1)res=res*x%mod;        x=x*x%mod;        n>>=1;    }    return res;}int main(){    int t;    int cnt=0;    scanf("%d",&t);    while(t--)    {        int n,k;        scanf("%d%d",&n,&k);        double p=k*log10(n)-(int)(k*log10(n));        p=pow(10,p);        int x=p*100;        int y=mod_pow(n,k,1000);        printf("Case %d: %d %03d\n",++cnt,x,y);    }    return 0;}


原创粉丝点击