1282 - Leading and Trailing ---LightOj1282(快速幂 + 数学)

Posted 啦咯

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1282 - Leading and Trailing ---LightOj1282(快速幂 + 数学)相关的知识,希望对你有一定的参考价值。

http://lightoj.com/volume_showproblem.php?problem=1282

题目大意: 求n的k次方的前三位和后三位数然后输出

后三位是用快速幂做的,我刚开始还是不会快速幂,后来慢慢理解了。

前三位求得比较厉害

我们可以吧n^k = a.bc * 10.0^m;

k*log10(n)  = log10(a.bc) + m;

m为k * lg(n)的整数部分,lg(a.bc)为k * lg(n)的小数部分;

x = log10(a.bc) = k*log10(n) - m = k*log10(n) - (int)k*log10(n);

x = pow(10.0, x);

 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<queue>

using namespace std;
typedef long long int LL;
#define N 1001000
#define ESP 1e-8
#define INF 0x3f3f3f3f
#define memset(a,b) memset(a,b,sizeof(a))

int Pow(int a, int b, int c)
{
    if(b == 0)
        return 1;
    LL t = Pow(a, b>>1, c);

    t = t*t%c;
    if(b%2 == 1)
        t = t*a%c;

    return t;
}///快速幂

int main()
{
    int T, t=1;
    scanf("%d", &T);
    while(T --)
    {
        int n, k;
        scanf("%d %d", &n, &k);

        double m = k*log10(n) - (LL)(k*log10(n));
        m = pow(10.0, m);

        int ans = Pow(n, k, 1000);

        printf("Case %d: %d %03d\n", t++, (int)(m*100), ans);
    }
    return 0;
}

 

以上是关于1282 - Leading and Trailing ---LightOj1282(快速幂 + 数学)的主要内容,如果未能解决你的问题,请参考以下文章

1282 - Leading and Trailing 求n^k的前三位和后三位。

LightOJ 1282 Leading and Trailing (数学)

LightOJ - 1282 Leading and Trailing

LightOJ - 1282 -Leading and Trailing

LightOJ - 1282 Leading and Trailing (数论)

快速幂 E - Leading and Trailing LightOJ - 1282