lightoj 1282 Leading and Trailing
2017-08-15 17:50
51 查看
题目大意就是给你 n 和 k 让你求出n的k次方的前三位数和后三位数
直接求肯定不可能,求后三位可以直接快速幂求取
但是前三位就恶心了,其实是需要一个知识点——就是要把大数转化成整数和小数的形式。
任何数n可以化成10^a,而本题是求n^k,所以n=10^(a*k)=10^(i+d)=10^i*10^d,其中i是a*k的整数部分,d是a*k的小数部分。
d可以由fmod(a*k,1)求出,fmod的作用是求浮点数的模,所以这个式子能求出a*k小于1的部分即小数部分。前面又可以根据n=10^a得a=log10(n)。
接着看10^i*10^d,现在就差i,容易想到i是控制小数的位数,因为i是整数嘛,现在要求前三位,所以i=2就行了。
所以最后求前三位的公式就出来了:pow(10,fmod(log10(n)*k,1)+2),可以直接隐式转换成int型去掉小数部分。
后三位用快速幂就行,
另外还有一个坑点,后三位算出来可能是0,所以要格式化成三位0(真坑)
You are given two integers: n and k, your task is to find the most significant three digits, and least significant three digits 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 leading digits (most significant) and three trailing digits (least significant). You can assume that the input is given such that nk contains at least six digits.
Sample Input
5
123456 1
123456 2
2 31
2 32
29 8751919
Sample Output
Case 1: 123 456
Case 2: 152 936
Case 3: 214 648
Case 4: 429 296
Case 5: 665 669
第二个代码是网上的
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <cstdio>
#include <map>
#include <cmath>
#include <algorithm>
#define INF 0x3f3f3f3f
#define MAXN 1000005
#define mod 1000000007
using namespace std;
int pow_mod(int a, int n,int m)
{
if(n==1)
return a%m;
int x=pow_mod(a,n/2,m);
long long ans=(long long)x*x%m;
if(n&1)
ans=ans*a%m;
return (int)ans;
}
int main()
{
int t,cnt=1;
long long n,k;
scanf("%d",&t);
while(t--)
{
scanf("%lld%lld",&n,&k);
int lead=pow(10,fmod(log10(n)*k,1)+2);
int trail=pow_mod(n,k,1000);
printf("Case %d: %d %03d\n",cnt++,lead,trail);
}
return 0;
}
直接求肯定不可能,求后三位可以直接快速幂求取
但是前三位就恶心了,其实是需要一个知识点——就是要把大数转化成整数和小数的形式。
任何数n可以化成10^a,而本题是求n^k,所以n=10^(a*k)=10^(i+d)=10^i*10^d,其中i是a*k的整数部分,d是a*k的小数部分。
d可以由fmod(a*k,1)求出,fmod的作用是求浮点数的模,所以这个式子能求出a*k小于1的部分即小数部分。前面又可以根据n=10^a得a=log10(n)。
接着看10^i*10^d,现在就差i,容易想到i是控制小数的位数,因为i是整数嘛,现在要求前三位,所以i=2就行了。
所以最后求前三位的公式就出来了:pow(10,fmod(log10(n)*k,1)+2),可以直接隐式转换成int型去掉小数部分。
后三位用快速幂就行,
另外还有一个坑点,后三位算出来可能是0,所以要格式化成三位0(真坑)
You are given two integers: n and k, your task is to find the most significant three digits, and least significant three digits 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 leading digits (most significant) and three trailing digits (least significant). You can assume that the input is given such that nk contains at least six digits.
Sample Input
5
123456 1
123456 2
2 31
2 32
29 8751919
Sample Output
Case 1: 123 456
Case 2: 152 936
Case 3: 214 648
Case 4: 429 296
Case 5: 665 669
#include<stdio.h> #include<string.h> #include<math.h> const int maxn=1e6; const int mod=1000; long long power(long long x,long long k)//后三位快速幂求取 { long long ans=1; while(k) { if(k&1) ans=ans*x%mod; x=x*x%mod; k /=2; } return ans; } int main() { int T,n,k; scanf("%d",&T); int cas=1; while(T--) { scanf("%d%d",&n,&k); int len = k*log10(n)+1; double t=pow(10,1.0*k*log10(n)-len+1); while(t<100) t*=10; int x=t; int y = power(n,k); printf("Case %d: %d %03d\n",cas++,x,y); } return 0; }
第二个代码是网上的
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <cstdio>
#include <map>
#include <cmath>
#include <algorithm>
#define INF 0x3f3f3f3f
#define MAXN 1000005
#define mod 1000000007
using namespace std;
int pow_mod(int a, int n,int m)
{
if(n==1)
return a%m;
int x=pow_mod(a,n/2,m);
long long ans=(long long)x*x%m;
if(n&1)
ans=ans*a%m;
return (int)ans;
}
int main()
{
int t,cnt=1;
long long n,k;
scanf("%d",&t);
while(t--)
{
scanf("%lld%lld",&n,&k);
int lead=pow(10,fmod(log10(n)*k,1)+2);
int trail=pow_mod(n,k,1000);
printf("Case %d: %d %03d\n",cnt++,lead,trail);
}
return 0;
}
相关文章推荐
- C++快速幂与大数取模算法示例
- 1.m分解阶乘之和
- 2.几种递推数
- 3.欧拉函数
- 4.快速幂模m算法
- 5.扩展欧几里得&&中国剩余定理
- 6.数论_web
- Project Euler Problem 387 - Harshad Numbers - 深度优先
- 编程之美2015初赛A
- [51nod1773][A国的贸易][fwt]解题报告
- [容斥+莫比乌斯]bzoj2440_完全平方数
- zoj3549 快速幂
- 雅克比算法 JAVA实现
- 快速幂
- 快速幂求余hpu
- 莫比乌斯反演
- HDU 3388 与m,n 互质的第k个整数
- BZOJ 2186 沙拉公主的困惑 逆元+素数筛+欧拉函数
- 数论题集
- 快速幂。素数筛选。辗转相除。