LightOJ-1282 Leading and Trailing 模算数 快速幂 对数的用法
题目链接: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 ...
随机推荐
- JavaScript实现双向链表
title: JavaScript实现双向链表 toc: false date: 2018-10-07 10:11:36 append(element): 添加元素到链表尾部 insert(posit ...
- FastJSON杂项
//通过TypeReference解决泛型的问题 List<Integer> rst = JSON.parseObject(v,new TypeReference<List<I ...
- dialog.setCancelable与setCanceledOnTouchOutside的区别
dialog.setCancelable(false); dialog弹出后会点击屏幕或物理返回键,dialog不消失 dialog.setCanceledOnTouchOutside(false); ...
- 利用canvas制作简单的logo
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- 如何把非服务程序(一般的应用程序)注册为Windows服务
非服务程序:不是标准的服务形式的程序吧,只是普通的应用程序. 1.要实现这个功能要用到微软提供的两个小工具“instsrv.exe”和“srvany.exe”,工具可以从微软下载安装工具包得到:htt ...
- SpringBoot学习笔记(15)----SpringBoot使用Druid
直接访问Druid官网wiki,有详细教程,地址如下: SpringBoot支持Druid地址:https://github.com/alibaba/druid/tree/master/druid-s ...
- SpringBoot学习笔记(1)----环境搭建与Hello World
简介: Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配 ...
- K8s初探
1. K8s概述 2. K8s的工作原理 什么是K8s 用法: 核心概念 集群 Kubernetes Master Node Pod Lable Replication Con ...
- 基本数据类型(dict)
1.定义 dict => {"key":'value',"a":1} 字典是无序的,字典是可变的 字典的键 => 可哈希(不可变),唯一 字典的值 ...
- 滴滴云安装mysql数据库
Linux CentOS安装配置MySQL数据库 没什么好说的,直接正面刚吧. 安装mysql数据库 a)下载mysql源安装包:wget http://dev.mysql.com/get/mys ...