UVA Leading and Trailing 11029【数学+快速幂】

11029 - Leading and Trailing

Time limit: 3.000 seconds

Apart from the novice programmers, all others know that you can’t exactly represent numbers raised

to some high power. For example, the C function pow(125456, 455) can be represented in double data

type format, but you won’t get all the digits of the result. However we can get at least some satisfaction

if we could know few of the leading and trailing digits. This is the requirement of this problem.

Input

The first line of input will be an integer T < 1001, where T represents the number of test cases. Each

of the next T lines contains two positive integers, n and k. n will fit in 32 bit integer and k will be less

than 10000001.

Output

For each line of input there will be one line of output. It will be of the format LLL...TTT, where

LLL represents the first three digits of n k and TTT represents the last three digits of n k . You are

assured that n k will contain at least 6 digits.

Sample Input

2

123456 1

123456 2

Sample Output

123...456

152...936

题意:给你一个数n,让你求它的k次方之后的前三位和最后三位。

解题思路:

后三位比较好想,直接快速幂取余就可以了。主要最前面三位的计算。

我们可以想一个数,例如1589.  如果这个数换算一下,换成10^x次方。那么x就等于log10(1589).  而如果我们把log10(1589)Mod 1,对1取余的结果是我们只取x的小数位。试想,如果把x分成整数z和小数g,那么10^x=10^(z+g)=10^g*10^z,z是整数,所以10^z是10000~,一个数乘以10^z就代表我们要的数是z+1位的数字。如果把z换成2.我们就得到了一个三位的数字,而且这个数字就是n^k的前三位。

*fmod函数。fmod( x , y ),计算x / y的余数。

AC代码:

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

using namespace std;

typedef long long LL;

LL pow_mod(LL x,LL n)
{
    LL res=1;
    while(n){
        if(n&1) res=res*x%1000;
        x=x*x%1000;
        n>>=1;
    }
    return res;
}

int main()
{
    int t;
    scanf("%d",&t);
    int xp=0;
    while(t--){
        LL n,k;
        scanf("%lld%lld",&n,&k);
        int ans=pow(10,2+fmod(k*log10(n),1));
        int res=pow_mod(n,k);
        printf("%d...%03d\n",ans,res);
    }
    return 0;
}

版权声明:本文为博主原创文章,转载请注明出处。

时间: 2024-11-10 00:03:10

UVA Leading and Trailing 11029【数学+快速幂】的相关文章

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)

uva 11651 - Krypton Number System(矩阵快速幂)

题目链接:uva 11651 - Krypton Number System 题目大意:给定进制base,和分数score,求在base进制下,有多少个数的值为score,要求不能有连续相同的数字以及前导0.计算一个数的值即为相邻两位数的平方差和. 解题思路:因为score很大,所以直接dp肯定超时,但是即使对于base=6的情况,每次新添一个数score最大增加25(0-5),所以用dp[i][j]预处理出base平方以内的总数,然后用矩阵快速幂计算. #include <cstdio> #

Uva 11609 - Team ( 组合数学 + 二项式性质 + 快速幂取模 )

Uva 11609 - Team ( 组合数学 + 二项式性质 + 快速幂取模 ) 题意: 有N个人,选一个或多个人参加比赛,其中一名当队长,有多少种方案? (如果参赛者完全相同但是队长不同,也算是一种情况) [ 1<=n <= 10^9 ] 分析: 这题要用到组合式公式的性质 转化之后快速幂取模轻松搞定之 代码: //Uva 11609 - Team /* 组合数公式 + 二项式系数性质 + 快速幂 手动自己推 -> F[n] = C(n,1)*1 + C(n,2)*2 + C(n,n

uva 10743 - Blocks on Blocks(矩阵快速幂)

题目链接:uva 10743 - Blocks on Blocks 题目大意:问说n联骨牌有多少种,旋转镜像后相同不算同一组,一行的格子必须连续,如果答案大于10000,输出后四位. 解题思路:想了一下午的递推式,实在受不了,把推出的序列在网上搜了一下,有公式ai=5?ai?1?7?ai?2+4?ai?3 (i≥5) PS:哪位神人知道怎么推出来的请留言我,大恩不言谢~ #include <cstdio> #include <cstring> #include <algori

uva 11885 - Number of Battlefields(矩阵快速幂)

题目连接:uva 11885 - Number of Battlefields 题目大意:给出周长p,问多少种形状的周长为p的,并且该图形的最小包围矩阵的周长也是p,不包括矩形. 解题思路:矩阵快速幂,如果包含矩形的话,对应的则是斐波那契数列的偶数项,所以对应减去矩形的个数即可. #include <cstdio> #include <cstring> using namespace std; typedef long long ll; const ll MOD = 9876543

Uva 11149 - Power of Matrix ( 矩阵快速幂 )

Uva 11149 -Power of Matrix ( 矩阵快速幂 ) #include <cstdio> #include <cstring> #define CLR( a, b ) memset( a, b, sizeof(a) ) #define MOD 10 #define MAX_SIZE 40 struct Mat { int r, c; int mat[MAX_SIZE][MAX_SIZE]; Mat( int _r = 0 , int _c = 0 ) { CLR

UVA - 10229 - Modular Fibonacci (矩阵快速幂 + fibonacci)

题目传送:UVA - 10229 思路:就是简单的矩阵快速幂求fibonacci数列,然后注意可能中间结果会爆int,因为2^19有50多万 AC代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cmath> #include <queue> #include <stack> #includ

HDU 4599 Dice (概率DP+数学+快速幂)

题意:给定三个表达式,问你求出最小的m1,m2,满足G(m1) >= F(n), G(m2) >= G(n). 析:这个题是一个概率DP,但是并没有那么简单,运算过程很麻烦. 先分析F(n),这个用DP来推公式,d[i],表示抛 i 次连续的点数还要抛多少次才能完成.那么状态转移方程就是 d[i] = 1/6*(1+d[i+1]) + 5/6*(1+d[1]), 意思就是说在第 i 次抛和上次相同的概率是1/6,然后加上上次抛的和这一次,再加上和上次不同的,并且又得从第1次开始计算. 边界就是

数学——快速幂

Wikioi 3285 转圈游戏 题目描述 Description n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏.按照顺时针方向给 n 个位置编号,从0 到 n-1.最初,第 0 号小伙伴在第 0 号位置,第 1 号小伙伴在第 1 号位置,……,依此类推.游戏规则如下:每一轮第 0 号位置上的小伙伴顺时针走到第 m 号位置,第 1 号位置小伙伴走到第 m+1 号位置,……,依此类推,第n - m号位置上的小伙伴走到第 0 号位置,第n-m+1 号位置上的小伙伴走到第 1 号位置,……,第