题意
输出\(n^n\)的首位的数字。
题解
用科学计数法表示\(n^n=k\cdot 10^b\),那么\(n log_{10} n=log_{10} k+b\),b就是\(n^n\)的位数,因此是\(\lfloor n log_{10} n\rfloor\)。
\(k=10^{n log_{n}-b}\)取k的整数部分即可。 我比赛的时候没想到这样做,于是转为小数,再用快速幂暴力做的。代码
#include#include #include #include using namespace std;int n;int main() { while(~scanf("%d",&n)) printf("%d\n",(int)pow(10,n*log10(n)-(int)(n*log10(n)))); return 0;}
快速幂暴力
#include#include #include #include #define ll long longusing namespace std;double pow(double a,int b){ double ans=1; while(b){ if(b&1){ ans=ans*a; } a=a*a; while(a<0.01)a*=10; b>>=1; } return ans;}int main() { int n; while(~scanf("%d",&n)){ double t=n; while(t>=1)t/=10; double ans=pow(t,n); while(ans<1)ans*=10; printf("%d\n",(int)ans); } return 0;}