NOI4.4.1708 麦森数 题解(C++)
先来个动图乐呵乐呵。
Java和C++的区别:
纯属玩笑。。。
好久没写题解了,今天来一道经典的分治题——麦森数。
题目传送门
请听题:
1708:麦森数
总时间限制: 1000ms 内存限制: 65536kB
描述
形如2p-1的素数称为麦森数,这时P一定也是个素数。但反过来不一定,即如果P是个素数。2p-1不一定也是素数。到1998年底,人们已找到了37个麦森数。最大的一个是P=3021377,它有909526位。麦森数有许多重要应用,它与完全数密切相关。
任务:从文件中输入P (1000<P<3100000) ,计算2p-1的位数和最后500位数字(用十进制高精度数表示)
输入
文件中只包含一个整数P(1000<P<310 0000)
输出
第1行:十进制高精度数2p-1的位数。
第2-11行:十进制高精度数2p-1的最后500位数字。(每行输出50位,共输出10行,不足500位时高位补0)
不必验证2p-1与P是否为素数。 (多么令人高兴啊)
样例输入和输出作者不提供,太多了~
首先,你可以非常明确的知道这一题要用分治+高精度来解决,毕竟21000-1还是最小的。
输出的第一行就已经让人很头痛了,只不过有一个相当好用的公式直接输出。请看下面:
floor(log(2)/log(10)*n+1)
这是什么意思呢?就是指一个二进制位占十进制位中多少位,再乘以次方数(n),最后加一且向下取整就OK了。就是酱紫的。
我们可以试一试能不能输出正确的位数。
#include<iostream>
#include<math.h>
using namespace std;
int n;
int main(){
cin>>n;
cout<<(long long)floor(log(2)/log