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;
}

 

posted @ 2016-05-31 18:56  啦咯  阅读(762)  评论(0编辑  收藏  举报