题目链接: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. Swift学习笔记(8):闭包

    目录: 基本语法 尾随闭包 值捕获 自动闭包 闭包是自包含的函数代码块,闭包采取如下三种形式之一: ・全局函数是一个有名字但不会捕获任何值的闭包 ・嵌套函数是一个有名字并可以捕获其封闭函数域内值的闭包 ...

  2. jq弹窗(获取页面宽高,滚轮高度,始终居中)

    jq写一个弹窗,效果如上图所示, 点击按钮弹窗弹出,右上角关闭. 弹窗始终显示在页面中间,无论放大缩小窗口,滚轮滚动. 代码如下: html: <br><br><br&g ...

  3. 【原创】Apache和Tomcat实现动静分离

    集群中每个节点都启用了页面静态化功能,所以,为了防止单个节点刷新造成找不到页面问题,将每个节点刷新的页面都放入apache虚拟目录下,由apache统一来处理.静态页面由apache处理,动态页面仍然 ...

  4. SpringCloud学习笔记(12)----Spring Cloud Netflix之Hystrix断路器的流程和原理

    工作流程(参考:https://github.com/Netflix/Hystrix/wiki/How-it-Works) 1. 创建一个HystrixCommand或HystrixObservabl ...

  5. Sublime Text编辑器配置Python解释器简易教程

    前天在微信上遇到一个小伙伴问我一个关于Sublime text配置Python解释器的问题,可能是初学者,对这方面还不是很懂,想使用快捷键但是徒劳一场,因为缺少Python解释器,直接按下快捷键Ctr ...

  6. 安装lnmp前请先运行screen

    当通过putty或者SecureCRT安装lnmp时, 网络突然掉线或者不小心putty被关掉等等原因, 造成lnmp安装过程被中断怎么办? 其实防止这种现象很简单, 只要在安装lnmp前执行scre ...

  7. 由Request Method:OPTIONS初窥CORS(转)

    刚接触前端的时候,以为HTTP的Request Method只有GET与POST两种,后来才了解到,原来还有HEAD.PUT.DELETE.OPTIONS…… 目前的工作中,HEAD.PUT.DELE ...

  8. PL SQL Developer使用总结

    如果OS为windows 7 64位系统,Oracle版本为 Oracle 11g 64 安装PL SQL Developer 请参考    http://myskynet.blog.51cto.co ...

  9. linux 空间不够了 修改 /boot

    1>  查看空间多少:df -h2>  查看当期内核: uname -r3>  查找内核   rpm -qa | grep kernel4>  删除多余的内核 yum remo ...

  10. HDU——T 1068 Girls and Boys

    http://acm.hdu.edu.cn/showproblem.php?pid=1068 Time Limit: 20000/10000 MS (Java/Others)    Memory Li ...