洛谷 P1045 & [NOIP2003普及组] 麦森数
题目链接
https://www.luogu.org/problemnew/show/P1045
题目大意
本题目的主要意思就是给定一个p,求2p-1的位数和后500位数。
解题思路
首先看一下数据范围,我们不难发现此题必须要用高精度来做。但是每一次高精度乘法的复杂度是o(n)的(n为数字的位数),所以很显然需要加一个快速幂。但是事实证明快速幂+高精度也会超时,所以我们必须进一步优化时间。
根据题意,我们可知,只需要记录下后500位数即可,这里牵扯到一点点数论的知识,这一个数字的后500位是与500位以外的数是没有一点关系的,根据这个性质,我们就可以开一个500大的数组,每一次记录后500位的数字即可。
但是此题还有一个难点,就是求总的位数,这里要运用数论知识。
我们不难发现,2n的最后一位不可能是0,所以2p和2p-1的位数是一样的,我们只需求出2p的位数即可。
我们知道,如果某个数是10n,那么这个数就有n+1位数字。我们知道,log10(2)意思是10的多少次方=2,所以10log10(2)=2。所以我们把2p写成(10log10(2) )p,再根据幂的平方运算法则写成10log10(2)*p,而10log10(2)*p的位数是log10(2)*p+1,也就是2p的位数是log10(2)*p+1,也就是2p-1的位数是log10(2)*p+1。
最后一定要注意输出格式!!本人因此爆零。。
附代码
#include<iostream> //快速幂:2的p次方=(2的平方)的p/2次方 = ((2的平方)的平方)的 p/2/2次方......
#include<cstdio> // f存的就是底数——2,2的2次方,2的二次方的二次方......
#include<cmath> // res 存的就是最后的答案
#include<cstring> // sav是每一次高精度乘法的临时数组
using namespace std;
int p,f[],res[],sav[]; //数组开500多一点已足够
void rr1() { //rr1是将答案更新,乘上现在的底数
memset(sav,,sizeof(sav));
for(int i = ;i <= ; i++) //动手画一下 ,列一个竖式,就会发现[i]*[j]得到的数字其实是[i+j-1]位上的数字
for(int j = ;j <= ; j++) //这里只是乘,还没有进位
if(i+j<=) sav[i+j-] += res[i] * f[j];
for(int i = ;i <= ; i++) { //进位
sav[i+] += sav[i] / ;
sav[i] %= ;
}
memcpy(res,sav,sizeof(res)); //把求出来的数组sav更新到res中
}
void rr2() { //rr2求得是底数的平方的值,存在f中
memset(sav,,sizeof(sav)); //同上
for(int i = ;i <= ; i++)
for(int j = ;j <= ; j++)
if(i+j<=)sav[i+j-] += f[i] * f[j];
for(int i = ;i <= ; i++) {
sav[i+] += sav[i] / ;
sav[i] %= ;
}
memcpy(f,sav,sizeof(f));
}
int main() {
scanf("%d",&p);
printf("%d\n",(int)(log10() * p + )); //先输出位数
res[] = ;
f[] = ; //初始化要为2,否则会一直乘1
while(p != ) { //快速幂
if(p % == ) rr1(); //任何一个数一直/2最后一定是1,这样就能确保更新答案
p /= ; //rr1,rr2为高精度乘法
rr2(); //每一次都更新一遍f,也就是底数的平方
}
res[] -= ;
for(int i = ;i >= ; i--)
if(i != && i % == ) printf("\n%d",res[i]); //注意输出格式。
else printf("%d",res[i]);
return ;
}
AC代码
//NOIP2003普及组t4
洛谷 P1045 & [NOIP2003普及组] 麦森数的更多相关文章
- P1045 [NOIP2003 普及组] 麦森数
题目描述 形如2^P−1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2^P−1不一定也是素数. 到1998年底,人们已找到了37个麦森数.最大的一个是P=3021377, ...
- [NOIP2003普及组]麦森数(快速幂+高精度)
[NOIP2003普及组]麦森数(快速幂+高精度) Description 形如2^P-1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2^P-1不一定也是素数.到1998 ...
- 【转】[NOIP2003普及组]麦森数
来源:http://vivid.name/tech/mason.html 不得不纪念一下这道题,因为我今天一整天的时间都花到这道题上了.因为这道题,我学会了快速幂,学会了高精度乘高精度,学会了静态查错 ...
- 动态规划 洛谷P1048 [NOIP2005 普及组] 采药
洛谷P1048 [NOIP2005 普及组] 采药 洛谷的一个谱架-的题目,考的是01背包问题,接下来分享一下我的题解代码. AC通过图: 我的代码: 1 //动态规划 洛谷P1048 [NOIP20 ...
- 求最长子序列(非连续)的STL方法 - 洛谷P1020 [NOIP1999 普及组] 导弹拦截
先给出例题:P1020 [NOIP1999 普及组] 导弹拦截 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 大佬题解:P1020 [NOIP1999 普及组] 导弹拦截 - 洛谷 ...
- 洛谷P1077 [NOIP2012普及组]摆花 [2017年四月计划 动态规划14]
P1077 摆花 题目描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能 ...
- 洛谷——P1980 [NOIP2013 普及组] 计数问题
题目描述 试计算在区间 11 到 nn的所有整数中,数字x(0 ≤ x ≤ 9)x(0≤x≤9)共出现了多少次?例如,在 11到1111中,即在 1,2,3,4,5,6,7,8,9,10,111,2, ...
- 洛谷 1067 NOIP2009 普及组 多项式输出
[题解] 一道简单的模拟题.需要判一些特殊情况:第一项的正号不用输出,x的一次项不用输出指数,系数为0的项不用输出等等,稍微细心一下就好. #include<cstdio> #includ ...
- [洛谷P1062/NOIP2006普及组] 数列
首先题面是这样的: 给定一个正整数 k(3≤k≤15) ,把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当 k=3 时,这个序列是: 1,3,4,9,10,12,13,- ...
随机推荐
- 【LUOGU???】WD与数列 sam 启发式合并
题目大意 给你一个字符串,求有多少对不相交且相同的子串. 位置不同算多对. \(n\leq 300000\) 题解 先把后缀树建出来. DFS 整棵树,维护当前子树的 right 集合. 合并两个集合 ...
- react native 左边固定,右边横向滑动左右自适应高度
要实现的效果 https://zuobaiquan.github.io/blogImg/201903/01.gif
- nodejs+express创建一个简单的服务器
//首先安装express //1.引入express const express = require('express'); //2.创建服务器对象 let server = express(); ...
- jumpserver win终端无法添加
今天遇到一个问题是,guacd,tomcat部署完成以后jumpserver终端管理页里面还是只有coco的终端而没有guacd的终端
- 将字符串存储到注册表中,长度一定是 strlen(text) + 1
参考:https://docs.microsoft.com/en-us/windows/desktop/sysinfo/registry-value-types 将字符串存储到注册表中,长度参数一定要 ...
- GIT-windows系统部署gitblit服务器
windows系统部署 gitblit 服务器 1. 安装JAVA环境 下载Java,下载地址:http://www.java.com/zh_CN/ 安装Java.安装步骤不再详述. 配置J ...
- SEO基础内容
学习SEO人群 网络设计师 网站站长 搜索引擎相关人员 网络营销顾问 企业主 搜索引擎 Yahoo msn google baidu SEM包括SEO,竞价排名等 搜索引擎爬虫流程 派出爬虫-> ...
- 2018-2019-2 《Java程序设计》第7周学习总结
20175319 2018-2019-2 <Java程序设计>第7周学习总结 教材学习内容总结 本周学习<Java程序设计>第8章: 1.String类: Java专门提供了用 ...
- neufz
~~~~1--1--5--2020/4/23 08:50:30|1--1--5--2020/4/23 08:50:30|1--1--5--2020/4/23 08:50:30|1--1--5--202 ...
- 将JSON转换成MAP的工具类
package com.xxxx.util; import java.io.BufferedReader; import java.io.InputStream; import java.io.Inp ...