「十二省联考 2019」骗分过样例(提答+数论+乱搞):

「十二省联考 2019」骗分过样例(提答+数论+乱搞):

https://loj.ac/problem/3050

两个小时大概能玩个70+分,应该达到了平均水平。

1_998244353

没什么好说的,快速幂,对于test#3,可以直接高精度二进制分解,也可以用欧拉定理优化。

1?

发现得到的数都很小,因为模数>最大值,所以取最大值,往上增个1k多久发现有解了。

1?+

考虑如果有\(19^x和19^y(x>y)\),做个差\(19^x-19^y=19^y(19^{x-y}-1)\)

如果\(x,y,x-y\)同时存在,那么我们就可以知道上面的所有值,从而得到:
\(mo|19^x-19^y-19^y(19^{x-y}-1)\)

一种方法是找到一组\((x,y,x-y)\),然后枚举所有约数判,这个由于数太大了,所以很难写。

发现可以找到很多组\((x,y,x-y)\),取所有的结果的gcd就好了。

1_wa998244353

发现有负数,大力猜测是用了int溢出了。

实验后果然如此,但是#7指数很大,这个溢出又不能快速幂,怎么办?

这里脑抽了想不到怎么做。

注意到溢出后就和随机没什么区别,由生日悖论,循环节长度大概是\(\sqrt {mo}\)

2p

首先发现每一行的长度就是r-l+1,大力猜测是个区间什么的。

然后一看2、3、5、7,质数没得跑了。

\(r<=10^{12}\)可以区间筛,\(r<=10^{18}\)可以miller-rabin,需要卡一下下常(先判断是不是前20个质数的倍数)。

2u

还是区间,看到有0、+1、-1,\(\mu\)没得跑了。

对每个数,如果能pollard-pho分解质因数就好了,可惜分不得。

考虑先用\(10^6\)内的质数去区间分解,那么剩下的每个数最多由两个质数乘起来。

去掉完全平方数和质数后,剩下的数一定是两个质数的乘积。

miller-rabin上去判断TLE了,优化:

1.只判断\(>10^{12}\)的数。

2.随机次数少点发现也能过。

2g

打死想不到原根系列,想到了就是基础知识了。

判断一个\(x\)是不是原根,只需要判断\(x^{(mo-1)/p(p是(mo-1)的质因子)}\)是不是都不是1.

找到一个原根后,其它的原根可以通过\(x^{j}(gcd(j,mo-1)=1)\)得到。

2g?

枚举\(10^9~2*10^9\)的所有质数判断,大概十分钟。

Code:


#include<bits/stdc++.h>
#define fo(i, x, y) for(int i = x, _b = y; i <= _b; i ++)
#define ff(i, x, y) for(int i = x, _b = y; i <  _b; i ++)
#define fd(i, x, y) for(int i = x, _b = y; i >= _b; i --)
#define ll long long
#define pp printf
#define hh pp("\n")
using namespace std;
	
namespace sub1 {
	ll ksm(ll x, ll y, ll mo) {
		ll s = 1;
		for(; y; y /= 2, x = x * x % mo)
			if(y & 1) s = s * x % mo;
		return s;
	}
	
	const int mo = 998244353;
	
	const int N = 1005;
	
	int n;
	char s[N]; int len;

	void work() {
		scanf("%d", &n);
		fo(i, 1, n) {
			scanf("%s", s + 1);
			len = strlen(s + 1);
			ll y = 0;
			fo(j, 1, len) {
				y = (y * 10 + s[j] - '0');
				y %= (mo - 1);
			}
			pp("%lld\n", ksm(19, y, mo));
		}
	}
}

ll ksm_19(char *s, ll mo) {
	int n = strlen(s + 1);
	int a[100];
	fo(i, 1, n) a[n - i + 1] = s[i] - '0';
	ll v = 1, x = 19;
	while(n > 0) {
		ll y = 0;
		fd(i, n, 1) {
			y = y * 10 + a[i];
			a[i] = y / 2; y %= 2;
		}
		if(y & 1) v = v * x % mo;
		x = x * x % mo;
		while(n > 0 && a[n] == 0) n --;
	}
	return v;
}

namespace sub2 {
	const int N = 1e5 + 5;
	
	int n;
	
	ll ans[N];

	char s[N][50];
	
	ll mo;
	
	void work() {
		mo = 1145141;
		scanf("%d", &n);
		fo(i, 1, n) {
			scanf("%s", s[i] + 1);
		}
		fo(i, 1, n) {
			pp("%lld\n", ksm_19(s[i], mo));
		}

	}
}

namespace sub3 {
	const int N = 10005;
	
	int n;
	ll a[N];
	
	ll mo = 5211600617818708273ll;	
	
	ll mul(ll x, ll y, ll mo) {
		ll z = (long double) x * y / mo;
		z = x * y - z * mo;
		if(z < 0) z += mo; else if(z >= mo) z -= mo;
		return z;
	}
	
	ll ksm(ll x, ll y, ll mo) {
		ll s = 1;
		for(; y; y /= 2, x = mul(x, x, mo))
			if(y & 1) s = mul(s, x, mo);
		return s;
	}
	
	void work() {
		scanf("%d", &n);
		fo(i, 1, n) {
			scanf("%lld", &a[i]);
			pp("%lld\n", ksm(19, a[i], mo));
		}
	}
}

namespace sub4 {
	const int mo = 998244353;
	
	int a[10000005];
	
	map<int, int> bz;
	
	int n;
	
	void work() {
		int s = 1; a[0] = s;
		int l, r;
		fo(i, 1, 1e7) {
			s = s * 19 % mo;
			if(bz[s]) {
				l = bz[s], r = i - 1;
				break;
			}
			bz[s] = i;
			a[i] = s;
		}
		scanf("%d", &n);
		fo(i, 1, n) {
			ll x; scanf("%lld", &x);
			if(x <= r) {
				pp("%d\n", a[x]);
			} else {
				x -= l;
				x %= (r - l + 1);
				pp("%d\n", a[l + x]);
			}
		}
	}
}

namespace sub5 {
	
	const int N = 1e6 + 5;
	
	int p[N], p0, bp[N];
	
	void sieve(int n) {
		fo(i, 2, n) {
			if(!bp[i]) {
				p[++ p0] = i;
			}
			for(int j = 1; i * p[j] <= n; j ++) {
				bp[i * p[j]] = 1;
				if(i % p[j] == 0) break;
			}
		}
	}
	
	int n;
	int bz[N];
	
	ll mul(ll x, ll y, ll mo) {
		ll z = (long double) x * y / mo;
		z = x * y - z * mo;
		if(z < 0) z += mo; else if(z >= mo) z -= mo;
		return z;
	}
	
	#define ull unsigned long long
	ull rx = 1e9 + 7;
	ll randx(ll x, ll y) {
		rx ^= rx << 17;
		rx ^= rx >> 23;
		rx ^= rx << 39;
		return rx % (y - x + 1) + x;
	}
		
	ll ksm(ll x, ll y, ll mo) {
		ll s = 1;
		for(; y; y /= 2, x = mul(x, x, mo))
			if(y & 1) s = mul(s, x, mo);
		return s;
	}
	
	int pd(ll n) {
		fo(i, 1, 20) if(n == p[i]) return 1;
		fo(i, 1, 20) if(n % p[i] == 0) return 0;
		ll s = n - 1, c = 0;
		while(s % 2 == 0) s /= 2, c ++;
		fo(T, 1, 20) {
			ll x = randx(1, n - 1);
			x = ksm(x, s, n);
			fo(j, 1, c) {
				ll y = mul(x, x, n);
				if(y == 1 && x != 1 && x != n - 1) return 0;
				x = y;
			}
			if(x != 1) return 0;
		}
		return 1;
	}
	
	void work() {
		sieve(1e6);
		ll x, y;
		scanf("%d", &n);
		fo(i, 1, n) {
			scanf("%lld %lld", &x, &y);
			for(ll i = x; i <= y; i ++) {
				putchar(pd(i) ? 'p' : '.');
			}
			hh;
		}
	}
}

namespace sub6 {
	const int N = 1e6 + 5;
	
	int p[N], p0, bp[N];
	
	void sieve(int n) {
		fo(i, 2, n) {
			if(!bp[i]) {
				p[++ p0] = i;
			}
			for(int j = 1; i * p[j] <= n; j ++) {
				bp[i * p[j]] = 1;
				if(i % p[j] == 0) break;
			}
		}
	}
	
	int n;
	
	int bz[N];
	ll a[N], mu[N];
	
	#define ull unsigned long long
	ull rx = 1e9 + 7;
	ll randx(ll x, ll y) {
		rx ^= rx << 17;
		rx ^= rx >> 23;
		rx ^= rx << 39;
		return rx % (y - x + 1) + x;
	}
			
	ll mul(ll x, ll y, ll mo) {
		ll z = (long double) x * y / mo;
		z = x * y - z * mo;
		if(z < 0) z += mo; else if(z >= mo) z -= mo;
		return z;
	}
	
	ll ksm(ll x, ll y, ll mo) {
		ll s = 1;
		for(; y; y /= 2, x = mul(x, x, mo))
			if(y & 1) s = mul(s, x, mo);
		return s;
	}
	
	int pd(ll n) {
		ll s = n - 1, c = 0;
		while(s % 2 == 0) s /= 2, c ++;
		fo(T, 1, 3) {
			ll x = randx(1, n - 1);
			x = ksm(x, s, n);
			fo(j, 1, c) {
				ll y = mul(x, x, n);
				if(y == 1 && x != 1 && x != n - 1) return 0;
				x = y;
			}
			if(x != 1) return 0;
		}
		return 1;
	}
	
	void work() {
		sieve(1e6);
		scanf("%d", &n);
		fo(ii, 1, n) {
			ll x, y;
			scanf("%lld %lld", &x, &y);
			fo(i, 0, y - x) {
				a[i] = i + x;
				mu[i] = 1;
			}
			fo(_i, 1, p0) {
				ll i = p[_i];
				ll j = x / i * i; if(j < x) j += i;
				while(j <= y) {
					ll &v = a[j - x], &v2 = mu[j - x];
					int zs = 0;
					while(v % i == 0) v /= i, zs ++;
					if(zs > 1) v2 = 0; else v2 = -v2;
					j += i;
				}
			}
			fo(i, 0, y - x) {
				if(a[i] > 1) {
					ll t = sqrt(a[i]);
					if(t * t == a[i]) {
						mu[i] = 0;
					} else {
						if(a[i] <= 1e12 || pd(a[i]))
							mu[i] = -mu[i];
					}
				}
				putchar(mu[i] == 1 ? '+' : (mu[i] == -1 ? '-' : '0'));
			}
			hh;
		}
	}
}

namespace sub7 {
	const int N = 1e6 + 5;
	
	int p[N], p0, bp[N];
	
	void sieve(int n) {
		fo(i, 2, n) {
			if(!bp[i]) {
				p[++ p0] = i;
			}
			for(int j = 1; i * p[j] <= n; j ++) {
				bp[i * p[j]] = 1;
				if(i % p[j] == 0) break;
			}
		}
	}
	
	int n;
	
	ll mo;
	
	ll ksm(ll x, ll y) {
		ll s = 1;
		for(; y; y /= 2, x = x * x % mo)
			if(y & 1) s = s * x % mo;
		return s;
	}
	
	int d[100005], d0;
	
	ll u[100], u0;
	void fen(ll mo) {
		d0 = u0 = 0;
		ll x = mo - 1;
		for(int i = 1; i <= p0 && p[i] * p[i] <= x; i ++) if(x % p[i] == 0) {
			u[++ u0] = p[i];
			while(x % p[i] == 0) x /= p[i];
		}
		if(x > 1) u[++ u0] = x;
		fo(i, 1, u0) d[++ d0] = (mo - 1) / u[i];
	}
	
	int pdg(ll x) {
		fo(i, 1, d0) if(ksm(x, d[i]) == 1)
			return 0;
		return 1;
	}
	
	int bz[14000005];
	
	void work() {
		sieve(1e6);
		scanf("%d", &n);
		fo(T, 1, n) {
			ll x, y;
			scanf("%lld %lld", &x, &y);
			if(x == 233333333) {
				mo = 1515343657;
			} else scanf("%lld", &mo);
			fen(mo);
			if(y - x <= 8e5) {
				fo(i, x, y)  putchar(pdg(i) ? 'g' : '.');
			} else {
				ll g;
				for(g = 2; g <= 11; g ++) if(pdg(g))
					break;
				ll s = 1;
				fo(i, 1, mo - 1) {
					s = s * g % mo;
					int ky = 1;
					fo(j, 1, u0) if(i % u[j] == 0) ky = 0;
					if(ky) bz[s] = 1;
				}
				fo(i, x, y) putchar(bz[i] ? 'g' : '.');
			}
			hh;
		}
	}
}

string str;

int main() {
	freopen("software.in", "r", stdin);
	freopen("software.out", "w", stdout);
	cin >> str;
	if(str == "1_998244353") {
		sub1 :: work();
		return 0;
	}
	if(str == "1?") {
		sub2 :: work();
		return 0;
	}
	if(str == "1?+") {
		sub3 :: work();
		return 0;
	}
	if(str == "1wa_998244353") {
		sub4 :: work();
		return 0;
	}
	if(str == "2p") {
		sub5 :: work();
		return 0;
	}
	if(str == "2u") {
		sub6 :: work();
		return 0;
	}
	if(str == "2g" || str == "2g?") {
		sub7 :: work();
		return 0;
	}
}
posted @ 2020-03-27 21:43  Cold_Chair  阅读(374)  评论(0编辑  收藏  举报