题目:求 N M N^{M} NM的前 k k k位与后 k k k位数字。
数据范围: 1 < = N , M < = 1000000 , 1 < = k < = 16 1<=N,M<=1000000,1<=k<=16 1<=N,M<=1000000,1<=k<=16
对于求后 k k k位数字,只需使用快速幂即可解决。
对于求前 k k k位数字,可以采用与科学计数法类似的思想。
把N用科学计数法表示,设 N = a ∗ 1 0 b N=a*10^b N=a∗10b,则对 N N N的 M M M次方可以使用快速幂,对底数 a a a与指数 b b b的计算遵循科学计数法的计算,然后再把结果化为科学技术法的形式。
代码如下:
#include<cstdio>
#include<cmath>
using namespace std;
long long n,m;
struct sb{
double num;
long long sum;
}a,ans;
inline void operator *(sb &x,sb &y){
x.num=x.num*y.num;
x.sum=x.sum+y.sum;
while(x.num>=10){
x.num/=10;x.sum++;
}
}
inline void power(long long b){
for(;b;b>>=1){
if(b&1) ans*a;
a*a;
}
}
char str[110];
inline void solve(double val,int k){
int now_val=val;
for(register int i=0;i<k;i++){
str[i]=now_val+'0';
int now=val;
val=val*10;
now_val=val-now*10;
}
}
int k;
int main(){
scanf("%lld%lld%d",&n,&m,&k);
a.sum=log10(n);
long long cnt=a.sum;
a.num=n;
ans.num=1.000;ans.sum=0;
while(cnt>0) {
a.num/=10;
cnt--;
}
power(m);
//printf("%lf",ans.num);
solve(ans.num,k);
printf("%s\n",str);
}