题目链接: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 模算数 快速幂 对数的用法的更多相关文章
-
1282 - Leading and Trailing ---LightOj1282(快速幂 + 数学)
http://lightoj.com/volume_showproblem.php?problem=1282 题目大意: 求n的k次方的前三位和后三位数然后输出 后三位是用快速幂做的,我刚开始还是不会 ...
-
LightOJ 1282 Leading and Trailing (快数幂 + 数学)
http://lightoj.com/volume_showproblem.php?problem=1282 Leading and Trailing Time Limit:2000MS Me ...
-
LightOJ - 1282 - Leading and Trailing(数学技巧,快速幂取余)
链接: https://vjudge.net/problem/LightOJ-1282 题意: You are given two integers: n and k, your task is to ...
-
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 ...
-
LightOj 1282 Leading and Trailing
求n^k的前三位数字和后三位数字. 范围: n (2 ≤ n < 231) and k (1 ≤ k ≤ 107). 前三位: 设 n^k = x ---> lg(n^k)=lg(x) - ...
-
LightOJ 1282 Leading and Trailing 数论
题目大意:求n^k的前三位数 和 后三位数. 题目思路:后三位数直接用快速幂取模就行了,前三位则有些小技巧: 对任意正数都有n=10^T(T可为小数),设T=x+y,则n=10^(x+y)=10^x* ...
-
LightOJ 1282 Leading and Trailing (数学)
题意:求 n^k 的前三位和后三位. 析:后三位,很简单就是快速幂,然后取模1000,注意要补0不全的话,对于前三位,先取10的对数,然后整数部分就是10000....,不用要,只要小数部分就好,然后 ...
-
LightOJ - 1282 Leading and Trailing (数论)
题意:求nk的前三位和后三位. 分析: 1.后三位快速幂取模,注意不足三位补前导零. 补前导零:假如nk为1234005,快速幂取模后,得到的数是5,因此输出要补前导零. 2.前三位: 令n=10a, ...
-
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 ...
随机推荐
-
Sql Cursor example
USE [EUC]GO/****** Object: StoredProcedure [dbo].[SP_SME_QueryAuditLog] Script Date: 02/05/2015 ...
-
NEERC2014 Eastern subregional
\ 先把furthur的超碉线段树粘过来 //#pragma comment(linker, "/STACK:102400000,102400000") #include<c ...
-
EF实体框架之CodeFirst七
前面的6篇博客基本把Code First学习的差不多了,今天这篇学习下code first中的并发控制和事务,基本也快学完了,顶多就差数据迁移. 在数据库中也是有锁和事务的概念,在C#中也是存在,当然 ...
-
LinuxShell脚本攻略--第二章 命令之乐
用 cat 进行拼接 文件查找与文件列表玩转 xargs 用 tr 进行转换排序临时文件命名与随机数分割文件和数据根据扩展名切分文件名mv 批量重命名文件交互输入自动化 cat: echo 'Text ...
-
IEnumerable 接口 实现foreach 遍历 实例
额 为啥写着东西? 有次面试去,因为用到的时候特别少 所以没记住, 这个单词 怎么写! 经典的面试题: 能用foreach遍历访问的对象的要求? 答: 该类实现IEnumetable 接口 声明 ...
-
HttpModule在Web.config的配置和动态配置
学习笔记 ASP.Net处理Http Request时,使用Pipeline(管道)方式,由各个HttpModule对请求进行处理,然后到达 HttpHandler,HttpHandler处理完之后, ...
-
Oracle查看LogMiner的详解
Oracle数据库查看日志的方法很多,我们可以根据SQL语句来实现,也可以通过日志查看工具LogMiner来实现,本文我们主要就介绍了这一过程,接下来就让我们一起来了解一下吧. 一.Or ...
-
ThinkPHP 3.1.2 查询方式的一般使用2
//select id1> and id2< 默认是and $data['id']=array(array('gt',$id1),array('lt',$id2)); // $data[' ...
-
DaemonSet 典型应用场景 - 每天5分钟玩转 Docker 容器技术(129)
Deployment 部署的副本 Pod 会分布在各个 Node 上,每个 Node 都可能运行好几个副本.DaemonSet 的不同之处在于:每个 Node 上最多只能运行一个副本. DaemonS ...
-
Spring boot 的application.properties 全局配置
端口号.项目名称 application.properties: server.port=8888 server.context-path=/start 日志相关的配置 # 自定义日志配置路径 log ...