这道题太精彩了!

我一开始想直接一波暴力算,然后叫上去只有50分,50分超时

然后我改成万位制提高运算效率,还是只有50分

然后我丧心病狂开long long用10的10次方作为一位,也就是100亿进制

去做,然后交上去多过了一个点,60分

附上丧心病狂的代码

#include<cstdio>
#include<cctype>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std; typedef long long ll;
const int MAXN = 1123456 / 10;
const ll base = 1e10;
ll a[MAXN];
int len, n; void cal()
{
_for(i, 1, len) a[i] <<= 1;
_for(i, 1, len)
{
a[i+1] += a[i] / base;
a[i] %= base;
}
if(a[len+1])
{
len++;
a[len+1] += a[len] / base;
a[len] %= base;
}
} int main()
{
scanf("%d", &n);
len = 1; a[1] = 2;
REP(i, 1, n) cal(); int p = 1;
a[p] -= 1;
while(a[p] < 0)
{
a[p + 1]--;
a[p] += base;
p++;
}
if(a[len] == 0) len--; ll t = a[len], num = 0;
while(t) t /= 10, num++; printf("%d\n", len * 10 - 10 + num);
for(int i = 50, t = 0; i >= 1; i--, t++)
{
if(t == 5) puts(""), t = 0;
printf("%010lld", a[i]);
} return 0;
}

然后我最后还是看了题解

然后看到算位数真的是给折服的

还有这种操作???

由于10的x次方的位数是x+1

然后可以把2的p次方转化成类似10的x次方来算位数

然后这个时候就用到了log

一波骚操作可以得出位数就是p * lg(2) + 1

牛逼!

然后算前500位。

我竟然没看出这是个快速幂??????

用高精度做快速幂还是头一次。

不过稍微改一下就好了。

#include<cstdio>
#include<cctype>
#include<cstring>
#include<cmath>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std; typedef long long ll;
const int MAXN = 1123;
struct bignum
{
ll s[MAXN]; int len;
bignum() { memset(s, 0, sizeof(s)); len = 1; }
}; bignum operator * (const bignum& a, const bignum& b)
{
bignum c;
c.len = min(a.len + b.len - 1 , 500);
_for(i, 1, a.len)
_for(j, 1, b.len)
{
c.s[i+j-1] += a.s[i] * b.s[j];
c.s[i+j] += c.s[i+j-1] / 10;
c.s[i+j-1] %= 10;
}
if(c.s[c.len+1] && c.len < 500) c.len++;
return c;
} int main()
{
int b;
scanf("%d", &b);
printf("%d\n", (int)(b * log10(2)+ 1)); bignum res; res.s[1] = 1;
bignum a; a.s[1] = 2;
while(b)
{
if(b & 1) res = res * a;
b >>= 1;
a = a * a;
}
res.s[1] -= 1; for(int i = 500; i >= 1; i--)
{
if(i != 500 && i % 50 == 0) puts(""); //这个写法很简便
printf("%d", res.s[i]);
}
puts(""); return 0;
}

洛谷 P1045 麦森数 (快速幂+高精度+算位数骚操作)的更多相关文章

  1. 洛谷 P1045 麦森数

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

  2. 洛谷P1045 麦森数

    题目描述 形如2^{P}-12 ​P ​​ −1的素数称为麦森数,这时PP一定也是个素数.但反过来不一定,即如果PP是个素数,2^{P}-12 ​P ​​ −1不一定也是素数.到1998年底,人们已找 ...

  3. NOIP2003 普及组 洛谷P1045 麦森数 (快速幂+高精度)

    有两个问题:求位数和求后500位的数. 求位数:最后减去1对答案的位数是不影响的,就是求2p的位数,直接有公式log10(2)*p+1; 求后500位的数:容易想到快速幂和高精度: 1 #includ ...

  4. P1045麦森数

    P1045麦森数 #include<iostream> #include <cmath> #include <cstring> const int maxn = 1 ...

  5. 洛谷 P1226 【模板】快速幂||取余运算

    题目链接 https://www.luogu.org/problemnew/show/P1226 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 ...

  6. 洛谷试炼场-简单数学问题-P1045 麦森数-高精度快速幂

    洛谷试炼场-简单数学问题 B--P1045 麦森数 Description 形如2^P−1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果PP是个素数,2^P-1 不一定也是素数.到19 ...

  7. 【题解】[P1045] 麦森数

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

  8. 洛谷P1226 【模板】快速幂||取余运算

    题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出“b^p mod k=s” s为运算结果 S1: ...

  9. 洛谷P1313 计算系数【快速幂+dp】

    P1313 计算系数 题目描述 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数. 输入输出格式 输入格式: 输入文件名为factor.in. 共一行,包含5 个整数,分别 ...

随机推荐

  1. UVA10082-WERTYU(紫书例题3.2)

    A common typing error is to place the hands on the keyboard one row to the right of the correct posi ...

  2. [USACO17JAN] Subsequence Reversal序列反转 (dfs+记忆化)

    题目大意:给你一个序列,你可以翻转任意一段子序列一次,求最长不下降子序列长度 tips:子序列可以不连续,但不能破坏在原序列中的顺序 观察数据范围,n<=50,很小,考虑dfs *dfs来跑区间 ...

  3. 为什么要清除BSS段

    如题,看到uboot里有清除BSS段的代码,想知道这样做的目的是什么啊,BSS段默认值本来就是0了啊,希望大哥大姐们能详细的解说下,谢谢了 bss 段描述了未初始化的全局变量和静态变量的大小等信息,但 ...

  4. poj 3311 Hie with the Pie (状压dp) (Tsp问题)

    这道题就是Tsp问题,稍微加了些改变 注意以下问题 (1)每个点可以经过多次,这里就可以用弗洛伊德初始化最短距离 (2)在循环中集合可以用S表示更清晰一些 (3)第一维为状态,第二维为在哪个点,不要写 ...

  5. ZOJ 3640

    很简单的概率题了 设dp[x]为能力值 为x时出去的期望 天数 #include <iostream> #include <cstdio> #include <cmath ...

  6. flex 通过htmlservices链接moss的rest(rest 的get post方式)

    一:flex debug(调试)--trace() --moss导入 flex学习:1.flex出现不能使用trace调试语句的问题,控制台无信息输出.这个问题不须要改动安装文件的參量. 仅仅须要下载 ...

  7. 四种GCC内置位运算函数

    int __builtin_ffs (unsigned int x) 返回x的最后一位1的是从后向前第几位,比方7368(1110011001000)返回4. int __builtin_clz (u ...

  8. iOS开发- 生成/解析.vcf文件

    vcf, 通讯录导出的一种格式. 一.生成vcf文件 假设要把我们iPhone通讯录里的数据, 生成vcf格式文件. 我们能够借助iCloud. 小技巧:通过iCloud导出iPhone通讯录的方法 ...

  9. bzoj1019: [SHOI2008]汉诺塔(动态规划)

    1019: [SHOI2008]汉诺塔 题目:传送门 简要题意: 和经典的汉诺塔问题区别不大,但是题目规定了一个移动时的优先级: 如果当前要从A柱子移动,但是A到C的优先级比A到B的优先级大的话,那就 ...

  10. ThinkPHP新建控制器

    ThinkPHP新建控制器 一.效果图 二.步骤 1.新建控制器文件 2.编写控制器文件 3.访问控制器 三.注意事项