UVa 11029 Leading and Trailing(log法求大数前3位)
题意:
给定n, k,求n^k的前3位和后三位。
思路:
1. 后三位司空见惯,利用快速幂取模,二分法快速求解。
2. 前三位要费点周折了,要用到库函数以及log (后面默认10为底),有了这些知识储备就可以巧妙的求解前3位了。
先分析对于n求其前3位,n很大:a = logn,于是有n = 10^a。分解a = i + d,i为a的整数部分,d为小数部分
n = 10^i * 10^d,由于10^i只会影响位数,所以真正影响n的前3位的是10^d,求出10^d就OK了
#include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> long long int foo(int n, int k) { if (k == 1) return n % 1000; long long int ans; ans = foo(n, k >> 1); ans = (ans * ans) % 1000; if (k % 2) ans = (ans * n) % 1000; return ans; } void solve(int n, int k) { int t3 = foo(n, k); int l3 = (int)pow(10, 2 + fmod(k*log10(n*1.0), 1)); printf("%d...%03d\n", l3, t3); } int main() { int cases; scanf("%d", &cases); while (cases--) { int n, k; scanf("%d %d", &n, &k); solve(n, k); } return 0; }
-------------------------------------------------------
kedebug
Department of Computer Science and Engineering,
Shanghai Jiao Tong University
E-mail: kedebug0@gmail.com
GitHub: http://github.com/kedebug
-------------------------------------------------------