Codeforces225E - Unsolvable

Portal

Description

求所有对于方程\[z=\left \lfloor \frac{x}{2} \right \rfloor+y+xy\]不存在正整数\((x,y)\)\(z\)中,第\(n\)小的\(z\)。答案对\(10^9+7\)取模。

Solution

\(\left \lfloor \dfrac{x}{2} \right \rfloor\)看起来很烦,来把它去掉。
\(x\)为奇数时,原方程可化为\(2z+2= (2y+1)(x+1)\),其中\(2y+1\)是奇数,\(x+1\)是偶数。也就是说,\(z\)有解\(\Leftrightarrow 2z+2\)可以表示为奇数(非\(1\))与偶数的积。那么\(2z+2\)就不能含有任何的奇数质因子,只能是\(2\)的若干次幂,这是\(z\)无解的必要条件。
\(x\)为偶数时,原方程可化为\(2z+1= (2y+1)(x+1)\),其中\(2y+1\)是奇数,\(x+1\)是奇数。也就是说,\(z\)有解\(\Leftrightarrow 2z+1\)可以表示为奇数(非\(1\))与奇数(非\(1\))的积。那么\(2z+1\)作为一个奇数却不能表示成两个奇数的积,那么它只能是一个奇质数。这是\(z\)无解的另一个必要条件。
总结一下,\(z\)无解\(\Leftrightarrow 2z+2=2^k, 2z+1\)为质数\(\Leftrightarrow 2z+1=2^k-1\)且为质数
形如\(2^k-1\)的素数称为梅森素数(Mersenne prime),目前仅发现50个梅森素数,最大的是\(2^{77232917}-1\),有\(23249425\)位数。百度一下即可(摔!!!!!题解就是叫你上网查!!!!!)

Prime numbers like \(2^{a-1}\) are Mersenne primes. Only about 46 such numbers are found now. Powers of 2 for the firts 40 numbers you can find for example here.

Code

//Unsolvable
#include <cstdio>
typedef long long lint;
lint const H=1e9+7;
int p[50]={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,24036583,25964951,30402457,32582657,37156667};
int m[50]={0,1,3,15,63,4095,65535,262143,73741816,536396503,140130950,487761805,319908070,106681874,373391776,317758023,191994803,416292236,110940209,599412198,383601260,910358878,532737550,348927936,923450985,470083777,642578561,428308066,485739298,419990027,287292016,202484167,389339971,848994100,273206869,853092282,411696552,876153853,90046024,828945523,697988359,761934284,490117835,345345628,545328622,969088513};
int main()
{
    int n; scanf("%d",&n);
    printf("%d\n",m[n]);
    return 0;
}

P.S.

自己上网查是什么鬼啊!!!!!

转载于:https://www.cnblogs.com/VisJiao/p/Cf225E.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CodeForces - 616D是一个关于找到一个序列中最长的第k好子段的起始位置和结束位置的问题。给定一个长度为n的序列和一个整数k,需要找到一个子段,该子段中不超过k个不同的数字。题目要求输出这个序列最长的第k好子段的起始位置和终止位置。 解决这个问题的方法有两种。第一种方法是使用尺取算法,通过维护一个滑动窗口来记录\[l,r\]中不同数的个数。每次如果这个数小于k,就将r向右移动一位;如果已经大于k,则将l向右移动一位,直到个数不大于k。每次更新完r之后,判断r-l+1是否比已有答案更优来更新答案。这种方法的时间复杂度为O(n)。 第二种方法是使用枚举r和双指针的方法。通过维护一个最小的l,满足\[l,r\]最多只有k种数。使用一个map来判断数的种类。遍历序列,如果当前数字在map中不存在,则将种类数sum加一;如果sum大于k,则将l向右移动一位,直到sum不大于k。每次更新完r之后,判断i-l+1是否大于等于y-x+1来更新答案。这种方法的时间复杂度为O(n)。 以上是两种解决CodeForces - 616D问题的方法。具体的代码实现可以参考引用\[1\]和引用\[2\]中的代码。 #### 引用[.reference_title] - *1* [CodeForces 616 D. Longest k-Good Segment(尺取)](https://blog.csdn.net/V5ZSQ/article/details/50750827)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Codeforces616 D. Longest k-Good Segment(双指针+map)](https://blog.csdn.net/weixin_44178736/article/details/114328999)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值