lightoj 1282 求n^k的前面3位和后面三位

原创 2015年11月19日 18:25:59



1282 - Leading and Trailing
PDF (English) Statistics Forum
Time Limit: 2 second(s) Memory Limit: 32 MB

You are given two integers: n and k, your taskis to find the most significant three digits, and least significant threedigits 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 leadingdigits (most significant) and three trailing digits (least significant). Youcan assume that the input is given such that nk contains atleast six digits.

Sample Input

Output for Sample Input

5

123456 1

123456 2

2 31

2 32

29 8751919

Case 1: 123 456

Case 2: 152 936

Case 3: 214 648

Case 4: 429 296

Case 5: 665 669

 


Problem Setter: Shamim Hafiz
Special Thanks: Jane Alam Jan (Solution, Dataset)


题意:不说了。

分析:后面三位比较容易想到要用快速幂,模1000就行,注意要补足前导零。

前面三位可以把n的看次方表示成 x*10^(len-1)  即有 n^k = x*10^(len-1),

两边取log,能把指数化掉,len是n^k的数位, len = log(n^k). 除了x,所有数都知道了,就可以算了。


#include<bitset>
#include<map>
#include<vector>
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<stack>
#include<queue>
#include<set>
#define inf 0x3f3f3f3f
#define mem(a,x) memset(a,x,sizeof(a))

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;

inline int in()
{
    int res=0;char c;
    while((c=getchar())<'0' || c>'9');
    while(c>='0' && c<='9')res=res*10+c-'0',c=getchar();
    return res;
}
const int N=100100;

ll power(ll a,ll n)
{
    ll ret =1 ;
    while(n)
    {
        if(n&1) ret=ret*a%1000;
        a=a*a%1000;
        n>>=1;
    }
    return ret;
}
int main()
{
    int T=in(),ii=1;
    while(T--)
    {
        int n =in(),k=in();
        int len=k*log10(n*1.0);
        double x=pow(10.0,k*1.0*log10(n*1.0)-len+1);
        while(x<100) x*=10;
        int pre=x;
        ll last = power(n,k);
        printf("Case %d: %d ",ii++,pre);
        if(last>=100) printf("%lld\n",last);
        else if (last>=10) printf("0%lld\n",last);
        else printf("00%lld\n",last);
    }
    return 0;
}





版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

数论知识点1——快速幂取模-LightOJ 1282

数论知识点1——快速幂取模-LightOJ 1282 1.快速幂的思路 普通的幂运算操作是时间复杂度是O(n),这个速度的确很快,但是当n比较大的时候,普通的写法就会超时,我们考虑将ab这种形式,我...

lightoj1282 - Leading and Trailing(水题)

水题 末位取模快速幂 首位取对数瞎搞 题目链接 http://lightoj.com/volume_showproblem.php?problem=1282#include #include...

lightOJ 1282 Leading and Trailing

题目链接:http://lightoj.com/volume_showproblem.php?problem=1282 题意:给你一个数n,让你求这个数的k次方的前三位和最后三位 思路:求最后...

LightOJ - 1282 Leading and Trailing

题意: 求解n^k的后三位和前三位,后三位要有前导0,比如123001,前三位是123后三位是001。后三位用快速幂取模就行,前三位比较麻烦,推导,看了别人的博客之后的。 You ...

【lightoj1282】数学-小知识点

F - F 使用long long Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %ll...

LightOJ1282 Leading and Trailing 大数取首尾

1. 任何一个数都可以转换为10^k,k是一个小数,k的整数部分决定了这个数的位数,小数部分决定了每一位的值,根据此可以快速找到前三位。 2. 通过快速幂取模可以快速找到后三位。

Lightoj 1282 Leading and Trailing(前三后三位,学习fmod())

题目:http://lightoj.com/volume_showproblem.php?problem=1282 1282 - Leading and Trailing     PDF (E...

LightOJ 1282 Leading and Trailing

题意:给你n和k,求出n^k的前3位和后3位数字。后三位输出的时候一定要输出三位,比如1000000要输出000,不然会wa 思路:求后三位直接快速幂取模就行,求前三位:求前三位则需要一些数学知识,...

【LightOJ】1282 - Leading and Trailing(快速幂 & 数论)

点击打开题目 1282 - Leading and Trailing     PDF (English) Statistics Forum ...

kuangbin 数论 E题

此题不会前三位 参考:http://blog.csdn.net/lxpaopao/article/details/45417489 题意:给你一个数n,让你求这个数的k次方的前三位和最后三位 思路...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)