LightOJ - 1282 Leading and Trailin(快速幂,对数求大数前3位)

本文探讨了如何高效计算大数n的k次幂的前三位和后三位数字,通过数学推导和算法实现,解决了LightOJ-1282问题。文章提供了详细的分析过程和C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链接:LightOJ - 1282 Leading and Trailin

题意:

给出 n &ThickSpace; ( 2 ≤ n &lt; 2 31 ) n\;(2\le n\lt 2^{31}) n(2n<231) k &ThickSpace; ( 1 ≤ k ≤ 1 0 7 ) k\;(1\le k\le10^7) k(1k107),问 n k n^k nk的前三位和后三位分别为多少?
(题目保证 n k n^k nk最少有6位)



分析:

n k n^k nk的后三位直接快速幂对1000求模即可,比较难处理的是前三位。

前三位为 x x x n k n^k nk共有 m m m,则有:( [x]代表对x向下取整 )
x = [ n k 1 0 m − 3 ] x=\left [ \frac{n^k}{10^{m-3}} \right ] x=[10m3nk]
将其化为:
x = [ 1 0 lg ⁡ n k 1 0 m − 3 ] x=\left [ 10^{\lg\frac{n^k}{10^{m-3}}} \right ] x=[10lg10m3nk]
lg ⁡ n k 1 0 m − 3 = lg ⁡ n k − lg ⁡ 1 0 m − 3 = k lg ⁡ n − m + 3 \lg\frac{n^k}{10^{m-3}}=\lg n^k-\lg 10^{m-3}=k\lg n-m+3 lg10m3nk=lgnklg10m3=klgnm+3
&ThickSpace; ⟹ &ThickSpace; x = [ 1 0 k lg ⁡ n − m + 3 ] \implies x=\left [ 10^{k\lg n-m+3 } \right ] x=[10klgnm+3]
其中 m = [ lg ⁡ n k ] + 1 = [ k lg ⁡ n ] + 1 m=[\lg n^k]+1=[k\lg n]+1 m=[lgnk]+1=[klgn]+1



以下代码:

#include<bits/stdc++.h>
#define LL long long
using namespace std;
LL qpow(LL a,LL b,LL c)
{
    LL res=1;
    while(b)
	{
        if(b&1)
            res=(res*a)%c;
        a=(a*a)%c;
        b>>=1;
    }
    return res;
}
int main()
{
    int T,kase=1;
    scanf("%d",&T);
    while(T--)
    {
        LL n,k;
        scanf("%lld %lld",&n,&k);
        double m=floor(k*log10(n))+1;   //floor()即向下取整(也可使用强制类型转化)
        printf("Case %d: %.f %03lld\n",kase++,floor(pow(10,k*log10(n)-m+3)),qpow(n,k,1000));
                            //后三位要注意输出前导零
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值