您的位置:首页 > 大数据 > 人工智能

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

2017-07-22 22:57 423 查看
简直是可怕,这个题,居然是用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;

4000
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;
}


太强了了了了了了了了了!!!!!!,完全没想到还可以这样搞,真的是 我傻
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: