题目链接

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。

  最后一定要注意输出格式!!本人因此爆零。。

附代码

  1. #include<iostream> //快速幂:2的p次方=(2的平方)的p/2次方 = ((2的平方)的平方)的 p/2/2次方......
  2. #include<cstdio> // f存的就是底数——2,2的2次方,2的二次方的二次方......
  3. #include<cmath> // res 存的就是最后的答案
  4. #include<cstring> // sav是每一次高精度乘法的临时数组
  5. using namespace std;
  6. int p,f[],res[],sav[]; //数组开500多一点已足够
  7. void rr1() { //rr1是将答案更新,乘上现在的底数
  8. memset(sav,,sizeof(sav));
  9. for(int i = ;i <= ; i++) //动手画一下 ,列一个竖式,就会发现[i]*[j]得到的数字其实是[i+j-1]位上的数字
  10. for(int j = ;j <= ; j++) //这里只是乘,还没有进位
  11. if(i+j<=) sav[i+j-] += res[i] * f[j];
  12. for(int i = ;i <= ; i++) { //进位
  13. sav[i+] += sav[i] / ;
  14. sav[i] %= ;
  15. }
  16. memcpy(res,sav,sizeof(res)); //把求出来的数组sav更新到res中
  17. }
  18. void rr2() { //rr2求得是底数的平方的值,存在f中
  19. memset(sav,,sizeof(sav)); //同上
  20. for(int i = ;i <= ; i++)
  21. for(int j = ;j <= ; j++)
  22. if(i+j<=)sav[i+j-] += f[i] * f[j];
  23. for(int i = ;i <= ; i++) {
  24. sav[i+] += sav[i] / ;
  25. sav[i] %= ;
  26. }
  27. memcpy(f,sav,sizeof(f));
  28. }
  29. int main() {
  30. scanf("%d",&p);
  31. printf("%d\n",(int)(log10() * p + )); //先输出位数
  32. res[] = ;
  33. f[] = ; //初始化要为2,否则会一直乘1
  34. while(p != ) { //快速幂
  35. if(p % == ) rr1(); //任何一个数一直/2最后一定是1,这样就能确保更新答案
  36. p /= ; //rr1,rr2为高精度乘法
  37. rr2(); //每一次都更新一遍f,也就是底数的平方
  38. }
  39. res[] -= ;
  40. for(int i = ;i >= ; i--)
  41. if(i != && i % == ) printf("\n%d",res[i]); //注意输出格式。
  42. else printf("%d",res[i]);
  43. return ;
  44. }

AC代码

//NOIP2003普及组t4

洛谷 P1045 & [NOIP2003普及组] 麦森数的更多相关文章

  1. P1045 [NOIP2003 普及组] 麦森数

    题目描述 形如2^P−1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2^P−1不一定也是素数. 到1998年底,人们已找到了37个麦森数.最大的一个是P=3021377, ...

  2. [NOIP2003普及组]麦森数(快速幂+高精度)

    [NOIP2003普及组]麦森数(快速幂+高精度) Description 形如2^P-1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2^P-1不一定也是素数.到1998 ...

  3. 【转】[NOIP2003普及组]麦森数

    来源:http://vivid.name/tech/mason.html 不得不纪念一下这道题,因为我今天一整天的时间都花到这道题上了.因为这道题,我学会了快速幂,学会了高精度乘高精度,学会了静态查错 ...

  4. 动态规划 洛谷P1048 [NOIP2005 普及组] 采药

    洛谷P1048 [NOIP2005 普及组] 采药 洛谷的一个谱架-的题目,考的是01背包问题,接下来分享一下我的题解代码. AC通过图: 我的代码: 1 //动态规划 洛谷P1048 [NOIP20 ...

  5. 求最长子序列(非连续)的STL方法 - 洛谷P1020 [NOIP1999 普及组] 导弹拦截

    先给出例题:P1020 [NOIP1999 普及组] 导弹拦截 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 大佬题解:P1020 [NOIP1999 普及组] 导弹拦截 - 洛谷 ...

  6. 洛谷P1077 [NOIP2012普及组]摆花 [2017年四月计划 动态规划14]

    P1077 摆花 题目描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能 ...

  7. 洛谷——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, ...

  8. 洛谷 1067 NOIP2009 普及组 多项式输出

    [题解] 一道简单的模拟题.需要判一些特殊情况:第一项的正号不用输出,x的一次项不用输出指数,系数为0的项不用输出等等,稍微细心一下就好. #include<cstdio> #includ ...

  9. [洛谷P1062/NOIP2006普及组] 数列

    首先题面是这样的: 给定一个正整数 k(3≤k≤15) ,把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当 k=3 时,这个序列是: 1,3,4,9,10,12,13,- ...

随机推荐

  1. 配置spring的监听器 让spring随项目的启动而启动

    <!-- 配置spring的监听器 让spring随项目的启动而启动 --> <listener> <listener-class>org.springframew ...

  2. nginx--default_server定义规则及配置

    nginx 的 default_server 指令可以定义默认的 server 出处理一些没有成功匹配 server_name 的请求,如果没有显式定义,则会选取第一个定义的 server 作为 de ...

  3. 【CERC2016】【BZOJ4792】村庄 搜索

    题目大意 有一个 \(2^n\times 2^n\) 的网格,左下角坐标为 \((0,0)\),右上角坐标为 \((2^n,2^n)\). 定义格点 \((x,y)\) 为坐标系中坐标为 \((x,y ...

  4. 【集训队作业2018】【XSY3372】取石子 DP

    题目大意 有 \(n\) 堆石子,初始时第 \(i\) 堆石子有 \(a_i\) 个. 你每次取石子会取 \(k\) 个.在你取完一堆石子之后才能在下一堆中取石子. 游戏会进行 \(t\) 轮,每轮会 ...

  5. MT【325】垂心的向量形式

    设$H$为垂心,且$3\overrightarrow{HA}+4\overrightarrow {HB}+5\overrightarrow {HC}=\overrightarrow 0$,则$\cos ...

  6. openflow控制器和交换机之间的消息

    openflow控制器和交换机之间的消息 消息格式 openflow消息由64bit,8个字节组成 Openflow协议数据包由Openflow Header和Openflow Message两部分组 ...

  7. Linux-进程管理

    关于进程 Process what is process ? 什么是进程 process life cycle 进程的生命周期 process states 进程状态 什么是进程? 进程是已启动的可执 ...

  8. 在maven pom.xml中加载不同的properties ,如localhost 和 dev master等jdbc.properties 中的链接不一样

    [参考]:maven pom.xml加载不同properties配置[转] 首先 看看效果: 点开我们项目中的Maven projects 后,会发现右侧 我们profile有个可勾选选项.默认勾选l ...

  9. Spring定时器配置与运用,及Cron表达式的详解

    一:首先在spring的配置文件里配置一个定时器 <task:executor id="executor" pool-size="5" /> < ...

  10. Django web编程1 -- 创建项目和应用

    python:3.7.2 Django:2.1.7 1.创建虚拟环境 虚拟环境是系统的一个位置,可以在其中安装包,并将其与其他python包隔离. 创建目录,命名为learning_log,并切换到这 ...