【ZOJ3921 2016年浙大2月月赛L】【随机化 答案猜解】Parity Modulo P 大数mod大数mod2

Parity Modulo P

Time Limit: 2 Seconds        Memory Limit: 131072 KB

A Mersenne prime is a prime number of the form Mn = 2n − 1.This is to say that it is a prime number which is one less than a power of two. They are named after Marin Mersenne, a French Minim friar, who studied them in the early 17th century. The first four Mersenne primes (sequence A000668 in OEIS) are 3, 7, 31, and 127.

The 37th Mersenne prime is 23021377-1, which has 909526 decimal digits. You task is to give the parity of (x mod (23021377-1)). That is to say, try to find (x mod (23021377-1)) mod 2.

Input

There are multiple test cases. The input is very huge, nearly 5 MiB. Please use the fast IO methods. The first line of input contains an integer T(T≤ 50) indicating the number of test cases. For each test case:

There is an integer x in one line. (0≤ x< 101300000)

Output

For each test case, if the result is even, then output 0, otherwise output 1.

Sample Input
5
1
2
10
1000000007
12345478431674673261786478321654125365674123451276564712356471253674517132876760
Sample Output
1
0
0
1
0

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<ctype.h>
#include<math.h>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
void fre() { freopen("c://test//input.in", "r", stdin); freopen("c://test//output.out", "w", stdout); }
#define MS(x,y) memset(x,y,sizeof(x))
#define MC(x,y) memcpy(x,y,sizeof(x))
#define MP(x,y) make_pair(x,y)
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template <class T1, class T2>inline void gmax(T1 &a, T2 b) { if (b>a)a = b; }
template <class T1, class T2>inline void gmin(T1 &a, T2 b) { if (b<a)a = b; }
const int N = 13e5+10, M = 0, Z = 1e9 + 7, ms63 = 0x3f3f3f3f;
int casenum, casei;
char s[N];
char ans[5];
int main()
{
	MC(ans, "0110");
	int T = 0;
	scanf("%d", &casenum);
	for (int casei = 1; casei <= casenum; ++casei)
	{
		scanf("%s", s + 1); int l = strlen(s + 1);
		if (l < 909526)printf("%d\n", s[l] & 1);
		else printf("%c\n", ans[T++]);
	}
	return 0;
}
/*
【trick&&吐槽】
随机大法好,这下知道为什么做题叫做"搞"题了吧2333

【题意】
有T(50)组数据
给你一个超级大的数x,0<=x<=10^1300000
然后有一个特殊的素数y=2^3021377-1
然你求出x%y%2

【类型】
随机化 答案猜解

【分析】
这这道题x和y太大了,直接算的复杂度是要爆炸的。
然而我们发现之后%2,所以最后的答案不是0就是1

而数据组数不过50组。能否随机化AC?
题目还告诉了你一个重要信息,y=2^3021377-1,这个数字的位数有909526位。
如果不告诉你这个信息,
我们也是可以通过3021377/(log(10)/log(2)) = 909 525.10520925求得的。

我们发现,如果给你数的位数<909526,显然这个数没我们的素数大。
那么这个数最后一位是奇,答案就是1;是偶,答案就是0.

题目告诉你输入爆炸。
然而我们测得实际只有4组数据,位数>=909526

于是我们随机化(或者暴力)这4组的答案。就可以AC啦。

【时间复杂度&&优化】
枚举答案的技巧是什么呢?可以按照可能性高低来枚举
先枚举0011 0101 0110 1001 1010 1010

*/


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值