题目链接:https://cn.vjudge.net/problem/LightOJ-1282

题意

给出两个正整数n(2 ≤ n < 231), k(1 ≤ k ≤ 1e7)

计算n^k的前三位,末三位

思路

首先末三位很好算,这里就只需模算数+快速幂

然后考虑前三位的算法,这里主要问题是数据溢出(pow(n, k)计算不可行)

那么考虑把n换成浮点数,同时除掉10^m,再去pow(n, k)

我们可以通过$ 1\leq (\frac{n}{10m})k \leq 1000 $大概估计范围

但是这里主要有个问题,就是在n很小而k很大时m不好取,计算结果很可能是inf或者0

换一个方法,我们设 $ a\in Z, b\in R, b<1 $

那么必然有 $ nk==10{a+b} $ ,其中10a是一个控制位数的因子,而10b才是数字的主要信息

数字的前三位可以表示为 $ \lfloor 10^{b+2} \rfloor $

注意不要总以为出现精度问题手贱加个eps!

代码

写了两种快速幂,一种递归一种循环,原理都一样

#include <cstdio>
#include <cmath>
const double eps=1e-6;
int getPre(int n, int k){
// attention eps shouldn't appear!
double idx=(k*log10(n))-(int)(k*log10(n));//+2+eps;
return pow(10, idx)*100;
} int getPost(int n, int k){
int num=n%1000, ans=1;
for (int i=0; 1<<i <=k; i++){
if (k & 1<<i) ans=(ans*(num%1000))%1000;
num=((long long)num*num)%1000;
}return ans;
} int quikPow(int n, int k){
if (k==0) return 1;
if (k==1) return n%1000; long long tmp=quikPow(n, k/2);
tmp=(tmp*tmp)%1000;
if (k%2) tmp=(tmp*n)%1000;
return tmp;
} int main(void){
int T, n, k; scanf("%d", &T);
for (int cnt=1; cnt<=T; cnt++){
scanf("%d %d", &n, &k);
int pre=getPre(n, k), post=getPost(n, k);
printf("Case %d: %03d %03d\n", cnt, pre, post);
} return 0;
}
Time Memory Length Lang Submitted
None 1328kB 844 C++ 2018-05-16 08:09:54

LightOJ-1282 Leading and Trailing 模算数 快速幂 对数的用法的更多相关文章

  1. 1282 - Leading and Trailing ---LightOj1282(快速幂 + 数学)

    http://lightoj.com/volume_showproblem.php?problem=1282 题目大意: 求n的k次方的前三位和后三位数然后输出 后三位是用快速幂做的,我刚开始还是不会 ...

  2. LightOJ 1282 Leading and Trailing (快数幂 + 数学)

    http://lightoj.com/volume_showproblem.php?problem=1282 Leading and Trailing Time Limit:2000MS     Me ...

  3. LightOJ - 1282 - Leading and Trailing(数学技巧,快速幂取余)

    链接: https://vjudge.net/problem/LightOJ-1282 题意: You are given two integers: n and k, your task is to ...

  4. UVA 11029 || Lightoj 1282 Leading and Trailing 数学

    Leading and Trailing You are given two integers: n and k, your task is to find the most significant ...

  5. LightOj 1282 Leading and Trailing

    求n^k的前三位数字和后三位数字. 范围: n (2 ≤ n < 231) and k (1 ≤ k ≤ 107). 前三位: 设 n^k = x ---> lg(n^k)=lg(x) - ...

  6. LightOJ 1282 Leading and Trailing 数论

    题目大意:求n^k的前三位数 和 后三位数. 题目思路:后三位数直接用快速幂取模就行了,前三位则有些小技巧: 对任意正数都有n=10^T(T可为小数),设T=x+y,则n=10^(x+y)=10^x* ...

  7. LightOJ 1282 Leading and Trailing (数学)

    题意:求 n^k 的前三位和后三位. 析:后三位,很简单就是快速幂,然后取模1000,注意要补0不全的话,对于前三位,先取10的对数,然后整数部分就是10000....,不用要,只要小数部分就好,然后 ...

  8. LightOJ - 1282 Leading and Trailing (数论)

    题意:求nk的前三位和后三位. 分析: 1.后三位快速幂取模,注意不足三位补前导零. 补前导零:假如nk为1234005,快速幂取模后,得到的数是5,因此输出要补前导零. 2.前三位: 令n=10a, ...

  9. 1282 - Leading and Trailing 求n^k的前三位和后三位。

    1282 - Leading and Trailing You are given two integers: n and k, your task is to find the most signi ...

随机推荐

  1. (转载)Android之有效防止按钮多次重复点击的方法(必看篇)

    为了防止测试妹子或者用户频繁点击某个按钮,导致程序在短时间内进行多次数据提交or数据处理,那到时候就比较坑了~ 那么如何有效避免这种情况的发生呢? 我的想法是,判断用户点击按钮间隔时间,如果间隔时间太 ...

  2. JS异步操作之promise发送短信验证码.html

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta cont ...

  3. LeetCode(10)Regular Expression Matching

    题目如下: Python代码: # -*- coding:utf-8 -*- def ismatch(s,p): #先将dp[s+1][p+1]二维数组全置为False dp = [[False] * ...

  4. php截取字符串|php截取字符串前几位|php截取中文字符串

    转 截取字符串专题:php截取字符串函数,php 字符串长度,php截取字符串前几位 PHP截取中文字符串(mb_substr)和获取中文 => http://www.q3060.com/lis ...

  5. Vue this.$router.push、replace、go的区别

    1.this.$router.push 描述:跳转到不同的url,但这个方法会向history添加一个记录,点击后会返回到上一个页面 用法 //字符串 this.$router.push('home' ...

  6. 织梦(dedecms)循环调用多级子栏目如二级栏目下三级栏目

    本文是关于织梦DedeCMS调用多级子栏目的,拿来分享下. 后台已经建好栏目,对于产品展示栏 栏目导航如下图所示:  复制代码 代码如下: {dede:channelartlist cacheid=' ...

  7. HDU-4370 '0 or 1' 最短路 要考虑连通性

    题目链接:https://cn.vjudge.net/problem/HDU-4370 题意 给一个矩阵C(nn),要我们找到一个矩阵X(nn),满足以下条件: X_{12}+X_{13}+...X_ ...

  8. BZOJ 4472 [Jsoi2015]salesman(树形DP)

    4472: [Jsoi2015]salesman Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 417  Solved: 192[Submit][St ...

  9. 魔兽争霸RPG游戏-军团战争-游戏经验总结

    终于要写这篇了,上一篇是个意外. 2015年关注,一代鬼王Xun和GGL比赛.晚上11点之后,经常有水友赛.主播xun,会带着一帮小弟,玩一些游戏.比如魔兽争霸6v6,2v2,RPG游戏-军团战争,疯 ...

  10. 【codeforces 589G】Hiring

    [题目链接]:http://codeforces.com/problemset/problem/589/G [题意] 有n个人; 每个人每天在开始工作之前,都需要di单位的准备时间,然后才能开始工作; ...