CodeForces - 225E Unsolvable(梅森素数)

CodeForces - 225E Unsolvable(梅森素数)

CodeForces - 225E

题目大意

问不满足条件
z = [ x 2 ] + y + x y z=[\frac{x}{2}]+y+xy z=[2x]+y+xy
的数字z从小到大第n个是什么

解题思路

对x分开奇偶考虑

当x为偶数时,不妨令x=2k
z = k + y + 2 k y 2 z + 1 = 2 k + 2 y + 4 k y + 1 2 z + 1 = ( 2 k + 1 ) ( 2 y + 1 ) 2 k + 1 = 2 z + 1 2 y + 1 z=k+y+2ky\\ 2z+1=2k+2y+4ky+1\\ 2z+1=(2k+1)(2y+1)\\ 2k+1=\frac{2z+1}{2y+1} z=k+y+2ky2z+1=2k+2y+4ky+12z+1=(2k+1)(2y+1)2k+1=2y+12z+1
为满足无正整数解的条件2z+1为奇素数

当x为奇数时,不妨令x=2k+1
z = k + y + ( 2 k + 1 ) y z = k + 2 y + 2 k y z + 1 = ( 2 y + 1 ) ( k + 1 ) 2 k + 2 = 2 z + 2 2 y + 1 z=k+y+(2k+1)y\\ z=k+2y+2ky\\ z+1=(2y+1)(k+1)\\ 2k+2=\frac{2z+2}{2y+1} z=k+y+(2k+1)yz=k+2y+2kyz+1=(2y+1)(k+1)2k+2=2y+12z+2
为满足无正整数解的条件,2z+2不能有除了2以外的因数,因此 2 z + 2 = 2 q 2z+2=2^q 2z+2=2q

由此凡是满足条件的z均需要满足2z+1为梅森素数

由此简单进行梅森素数的推导即可

AC代码

	#include<bits/stdc++.h>
	#define int long long
	using namespace std;
	int mp[41] = {0,2, 3, 5, 7, 13, 17, 19, 31, 61, 89, 107, 127, 521, 607, 1279, 2203, 2281, 3217, 4253, 4423, 9689, 9941, 11213, 19937, 21701, 23209,
	44497, 86243, 110503, 132049, 216091, 756839, 859433, 1257787, 1398269, 2976221, 3021377, 6972593, 13466917, 20996011};
	typedef long long LL;
	const int mod=1e9+7;
	LL quick_pow(int a,int b)
	{
		LL ans=1;a=a%mod;
		while(b)
		{
			if(b&1) ans=ans*a%mod;
			a=a*a%mod;
			b>>=1;
		}
		return ans;
	}
	int32_t main()
	{
	 	int n;
	 	scanf("%lld",&n);
	 	cout<<quick_pow(2,mp[n]-1)-1<<endl;
	 }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值