E - Leading and Trailing
题目
给定两个数n,k 求n^k的前三位和最后三位
n是int范围,
分析
求后三位很简单,就是在快速幂的过程中模1000即可。但是求前三位就比较难处理了,用快速幂解决不了。这里我们可以考虑将其转换成double,如果可以转换成double计算,我们只要取出double结果的前三位就可以了。这里开始讲高中的数学导数:对于任意一个数,都可以转换成导数的形式,比如,所以这里的可以转换成.
x表示次方的整数部分,y表示次方的小数部分,我们可以发现无非是将的小数点往右移动x位而已。所以我们只需要将的小数点往右移动2位,此时整数部分就有3位了,然后转换成int就求出来了。
因为 所以肯定是,本身就有一个整数位,所以只需要移动2位就行
AC代码
#include <iostream> #include <algorithm> #include <cmath> using namespace std; typedef long long ll; ll a,b; int T; ll ksm(ll a,ll b){ ll res = 1; while(b){ if(b&1) res = res*a%1000; a = a*a%1000; b>>=1; } return res; } int main(){ cin>>T; int kase = 0; while(T--){ scanf("%lld %lld",&a,&b); ll trail = ksm(a,b); double y = fmod(b*log10(a),1); //取出次方的小数部分 ll head = (ll)(pow(10,y)*100);//计算后,往右移动2位 printf("Case %d: %03lld %03lld\n",++kase,head,trail); } return 0; }