UVA - 11029Leading and Trailing(快速幂取模取后三位 + log10()取前三位)

题目: UVA - 11029Leading and Trailing(快速幂取模取后三位 + log10()取前三位)

题目大意:给你N的k次方,然后要求你求出这个数的前三位和后三位。

解题思路:因为n和k都很大,这个数求出来是大数,所以可以用快速幂取模求后三位,因为后面的三位和前面的位数的没有关系。前面的三位比较难办。设x = log (n^k)  = k * log10(n),那么10^x = k * log10(n).将X = a(整数) + b(小数),整数部分10^a只是移动小数点,并不影响前三位。所以只需要求出10^b取前三位。用fmod(a, 1)表示求a的小数部分。

代码:

#include <cstdio>
#include <cmath>

using namespace std;

int num, k;

int f(int d) {

	if (d == 1)
		return num % 1000;
	if (d == 0)
		return 1;
	int n = f(d / 2) % 1000;
	n = (n * n) % 1000;
	if (d % 2)
		n = (n * (num % 1000)) % 1000;//注意num要%1000,不然会爆int
	return n;
}

int main () {

	int T;
	scanf ("%d", &T);

	while (T--) {

		scanf ("%d%d", &num, &k);
		int tail = f(k);
		int head = (int)pow (10, 2 + fmod (k * log10(num * 1.0), 1.0));
		printf ("%d...%03d\n", head, tail);
	}
	return 0;
}
时间: 2024-10-23 20:41:50

UVA - 11029Leading and Trailing(快速幂取模取后三位 + log10()取前三位)的相关文章

通过程序了解快速幂和模取幂运算的优化

建议先看第三个有解释的程序. 快速幂a^b 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main() 5 { 6 long a,b,result=1; 7 //a^b 8 scanf("%ld%ld",&a,&b); 9 while (b) 10 { 11 if ((b & 1)==1) 12 result=result*a; 13 a=a*a; 14 b>>=1; 1

Acdream 1007 快速幂,模乘法

http://acdream.info/problem?pid=1007 题目大意,给你n个数,输出这n个数的k次方的和,注意最后的结果得是正数. 刚开始因为模乘法没有考虑好,一直死wa不过,后来在模乘法中特判一下,终于ac了. #include<cstdio> typedef long long LL; const LL MOD = 10000000007LL; int n; LL k, temp, sum; LL mul_mod(LL a, LL b) { LL res = 0; int

UVA 10870 - Recurrences(矩阵快速幂)

UVA 10870 - Recurrences 题目链接 题意:f(n) = a1 f(n - 1) + a2 f(n - 2) + a3 f(n - 3) + ... + ad f(n - d), for n > d. 已知前d项求第n项 思路:矩阵快速幂,对应矩阵为 |a1 a2 a3 ... ad| |1 0 0 ... 0 0 0| |0 1 0 ... 0 0 0| |0 0 1 ... 0 0 0| |0 0 0 ... 0 0 0| |0 0 0 ... 1 0 0| |0 0 0

a^b(快速幂) 求 a 的 b 次方对 p 取模的值。

题目详情 求 a 的 b 次方对 p 取模的值. 输入格式 三个整数 a,b,p在同一行用空格隔开. 输出格式 输出一个整数,表示a^b mod p的值. 数据范围 0≤a,b,p≤10^9 输入样例: 3 2 7 输出样例: 2 问题解决 正常来说,计算机每秒可运算10^7-10^8次(以c++语言来说)所以这题如果用循环一个个的来乘,最大有10^9的运算量,有可能超时.应采用快速幂算法,运算量则会降为log级别的! 以上面提供的数据来说明 快速幂: 7转化为二进制为1112^0=12^1=2

数论——快速幂,模运算及快速幂求逆元

一.快速幂 原理: 快速幂的原理十分简单. ak=a2^0*a2^1*a2^2*…a2^x,其中k=20+21+22+…+2x. 这显然是正确的.因为任何一个数都可以表示成二进制. 接下去利用位运算实现即可. 代码实现 模板题链接:快速幂 代码模板如下:时间复杂度O(logk) int qmi(int a,int k,int p) { int res=1%p; while(k) { if(k&1)res=(long long)res*a%p; a=(long long)a*a%p; k>&g

UVA 11609 Teams 组合数学+快速幂

In a galaxy far far away there is an ancient game played among the planets. The specialty of the gameis that there is no limitation on the number of players in each team, as long as there is a captain inthe team. (The game is totally strategic, so so

Uva 10006-Carmichael Numbers(快速幂)

题目链接:点击打开链接 题意:给一个数n,问这个数是不是Carmichael Numbers,Carmichael Numbers的定义为:一个数n如果不是素数且对于对于任意的    2=<a<n 都满足 a^n%n=a,那么这个数就是Carmichael Numbers,否则不是.快速幂暴力解决. #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib

快速幂+乘模 模板

/************** 快速幂模板 调用:Quk_Mul(a,b,mod) 返回:a^b%mod 复杂度:当mod>10^9,log(mod)*log(b),否则log(b) ***************/ long long Mod_Mul(long long a,long long b,long long mod) { long long msum=0; while(b) { if(b&1) msum = (msum+a)%mod; b>>=1; a = (a+a)

UVa 11609 组队(快速幂)

https://vjudge.net/problem/UVA-11609 题意: 有n个人,选一个或多个人参加比赛,其中一名当队长,有多少种方案?如果参赛者完全相同,但队长不同,算作不同的方案. 思路: 之后就是快速幂处理. 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<vector> 6 #include&