您的位置:首页 > 大数据 > 人工智能

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<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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数论 快速幂