UVA 11029 Leading and Trailing

UVA_11029

    两数乘法的后三位自然是由各自后三位决定的,因此对于后三位我们完全可以用快速幂取模来做,但前三位就不行了。

    但对于n^k我们可以做变形10^(k*logn),这样又由于10^x只是改变小数点的位置我们自然就不用去考虑了,因此前3位只取决于10^(2+fmod(k*logn,1)),当输入最后结果的时候,由于要的是精确的前3位,所以应用强制转型忽略掉小数位,而不能直接用%.0f输出。

#include<stdio.h>
#include<string.h>
#include<math.h>
int N, K;
long long int dfs(int a, int n)
{
if(n == 1)
return a % 1000;
long long int ans = dfs(a, n / 2);
ans = (ans * ans) % 1000;
if(n % 2)
return (ans * a) % 1000;
else
return ans;
}
void solve()
{
int ans, res;
scanf("%d%d", &N, &K);
ans = (int)pow(10, 2 + fmod(K * log10(N), 1));
res = dfs(N, K);
printf("%d...%03d\n", ans, res);
}
int main()
{
int t;
scanf("%d", &t);
while(t --)
{
solve();
}
return 0;
}


你可能感兴趣的:(uva)