B

来源:互联网 发布:太极熊猫 mac 编辑:程序博客网 时间:2024/04/30 12:30

简直是可怕,这个题,居然是用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;}

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



原创粉丝点击