Leading and Trailing LightOJ - 1282(快速幂 + 数学log函数)

Leading and Trailing LightOJ - 1282

题意:

给你 n k n^k nk要求你求出 前三位后三位

思路:

  1. 后三位,很容易就是快速幂的模板。
  2. 主要是前三位。 n k = 1 0 l o g 10 n k = 1 0 k l o g 10 n n^k=10^{log_{10}n^k}=10^{klog_{10}n} nk=10log10nk=10klog10n
  3. 特别地,可以把 k l o g 10 n klog_{10}n klog10n看作 k l o g 10 n = a + b klog_{10}n = a+b klog10n=a+b
  4. 1 0 a + b = 1 0 a ∗ 1 0 b 10^{a+b} = 10^a*10^b 10a+b=10a10b
  5. 更特别地,可以把a看成整数部分,把b看成小数部分。
    那么 1 0 b ∈ [ 0 , 10 ) 10^b \in [0,10) 10b[0,10)
  6. 聪明的读者到这里,应该就可以发现了,前三位的ans就是 1 0 b ∗ 100 10^b *100 10b100

AC

#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
typedef long long ll;
ll pow(ll x, ll p, ll mod){
    ll res = 1;
    while(p){
        if(p&1)res =  res * x % mod;
        p >>= 1;
        x = x * x %mod;
    }
    return res;
}
int solve(ll n, ll k){
    double frac_part = k*log10(n) - (int)(k*log10(n));
    return (int)(pow(10,frac_part)*100);
}
int main()
{
    int tt, kase = 0;scanf("%d", &tt);//cin>>tt;
    while(tt--){
        ll n, k;
        scanf("%lld %lld", &n, &k);
        printf("Case %d: %d %03d\n", ++kase, solve(n,k), pow(n,k,1000));
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值