B - Leading and Trailing LightOJ - 1282(数学加快速幂)

43 篇文章 0 订阅
20 篇文章 0 订阅

简直是可怕,这个题,居然是用double。。

简直是神操作,是我太思维僵化了;居然想着只取前四位然后乘,寻找循环规律;

题目网址点击打开链接


对于前三位abc的求法,让我直接饮用大佬的解析

后三位直接用快数幂取余可以求出

前三位我们可以将n^k转化成a.bc * 10^m,这样abc就是前三位了,n^k =  a.bc * 10^m

即lg(n^k) = lg(a.bc * 10^m)

<==>k * lg(n) = lg(a.bc) + lg(10^m) = lg(a.bc) + m

m为k * lg(n)的整数部分,lg(a.bc)为k * lg(n)的小数部分

x = lg(a.bc) = k * lg(n) - m = k * lg(n) - (int)(k * lg(n))

a.bc = pow(10, x);

abc = a.bc * 100;

这样前三位数abc便可以求出

#include <iostream>
#include<cmath>
#include<cstring>
#include<cstdio>

using namespace std;

int Pow(int x,int y)
{
    int res=1;
    x=x%1000;
    while(y>0)
    {
        if(y&1)
            res=(res*x)%1000;
        x=(x*x)%1000;
        y/=2;
   }
    return res;
}
int main()
{
   // cout<<Pow(2,2)<<endl;
    //cout << "Hello world!" << endl;
    int t;
    cin>>t;
    for(int k=1;k<=t;k++)
    {
        int a,b;
        cin>>a>>b;
        double m=(double)b*log10(a)-(int)(b*log10(a));
        m=pow(10,m);
        int x=m*100;
        int y=Pow(a,b);

         cout<<"Case "<<k<<": ";
         printf("%d %03d\n",x,y);
    }
    return 0;
}

太强了了了了了了了了了!!!!!!,完全没想到还可以这样搞,真的是 我傻



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值