Lightoj1282——Leading and Trailing(幂取模求前三位)

来源:互联网 发布:曦力mac破解版 编辑:程序博客网 时间:2024/06/08 05:20

Description
You are given two integers: n and k, your task is to find the most significant three digits, and least significant three digits of nk.

Input
Input starts with an integer T (≤ 1000), denoting the number of test cases.

Each case starts with a line containing two integers: n (2 ≤ n < 231) and k (1 ≤ k ≤ 107).

Output
For each case, print the case number and the three leading digits (most significant) and three trailing digits (least significant). You can assume that the input is given such that nk contains at least six digits.

Sample Input
5
123456 1
123456 2
2 31
2 32
29 8751919
Sample Output
Case 1: 123 456
Case 2: 152 936
Case 3: 214 648
Case 4: 429 296
Case 5: 665 669

题解看了很久终于看懂了,总之就是要把大数转化成整数和小数的形式。
任何数n可以化成10^a,而本题是求n^k,所以n=10^(a*k)=10^(i+d)=10^i*10^d,其中i是a*k的整数部分,d是a*k的小数部分。
d可以由fmod(a*k,1)求出,fmod的作用是求浮点数的模,所以这个式子能求出a*k小于1的部分即小数部分。前面又可以根据n=10^a得a=log10(n)。
接着看10^i*10^d,现在就差i,容易想到i是控制小数的位数,因为i是整数嘛,现在要求前三位,所以i=2就行了。
所以最后求前三位的公式就出来了:pow(10,fmod(log10(n)*k,1)+2),可以直接隐式转换成int型去掉小数部分。
后三位用快速幂就行,
另外还有一个坑点,后三位算出来可能是0,所以要格式化成三位0(真坑)

#include <iostream>#include <cstring>#include <string>#include <vector>#include <queue>#include <cstdio>#include <map>#include <cmath>#include <algorithm>#define INF 0x3f3f3f3f#define MAXN 1000005#define mod 1000000007using namespace std;int pow_mod(int a, int n,int m){    if(n==1)        return a%m;    int x=pow_mod(a,n/2,m);    long long ans=(long long)x*x%m;    if(n&1)        ans=ans*a%m;    return (int)ans;}int main(){    int t,cnt=1;    long long n,k;    scanf("%d",&t);    while(t--)    {        scanf("%lld%lld",&n,&k);        int lead=pow(10,fmod(log10(n)*k,1)+2);        int trail=pow_mod(n,k,1000);        printf("Case %d: %d %03d\n",cnt++,lead,trail);    }    return 0;}
0 0
原创粉丝点击