QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#111813#1860. Historic BreakthroughzhoukangyangWA 40ms3696kbC++173.6kb2023-06-08 21:02:122023-06-08 21:02:40

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-06-08 21:02:40]
  • 评测
  • 测评结果:WA
  • 用时:40ms
  • 内存:3696kb
  • [2023-06-08 21:02:12]
  • 提交

answer

#include<bits/stdc++.h>
#define L(i, j, k) for(int i = (j); i <= (k); ++i)
#define R(i, j, k) for(int i = (j); i >= (k); --i)
#define ll __int128
#define vi vector <int>
#define sz(a) ((int) (a).size())
#define me(f, x) memset(f, x, sizeof(f))
#define uint unsigned int 
using namespace std;
const int N = 1 << 20;

int ctz(ll x) {
	if(!x) return 128;
	int cnt = 0;
	while(!(x & 1)) ++cnt, x >>= 1;
	return cnt;
}
ll gcd(ll a, ll b) {
	if(!a || !b) return a + b;
    ll az = ctz(a);
    ll bz = ctz(b);
    ll z = min(az, bz);
    b >>= bz;
    while(a) {
        a >>= az;
        ll diff = a - b;
        az = ctz(diff);
        b = min(a, b), a = diff > 0 ? diff : -diff;
    }
    return b << z;
}
mt19937_64 orz(1);

const int test[12] = {2, 3, 5, 7, 11, 13, 17, 19, 233}, K = 8;
ll x;
inline ll Mul(ll a, ll b, ll mod) {
	ll o = a * b - (ll) ((__float128) a * b / mod) * mod;
	while(o < 0) o += mod;
	while(o >= mod) o -= mod;
	return o; 
}
inline ll qpow(ll x, ll y, ll mod) {
	ll ret = 1;
	for(; y; x = Mul(x, x, mod), y >>= 1) if(y & 1) ret = Mul(ret, x, mod);
	return ret;
}
bool MR (ll x) {
	if(x <= test[K]) {
		L(i, 2, sqrt((int)x)) 
			if(x % i == 0) 
				return false;
		return true;
	}
	int j, k = 0;
	ll a = x - 1;
	for(; !(a & 1); a >>= 1, ++k) ;
	L(i, 0, K) {
		ll w = qpow(test[i], a, x); 
		if(w == 1 || w == x - 1) continue ;
		for(j = 0; j < k; ++j) {
			w = Mul(w, w, x);
			if(w == x - 1) break ;
		}
		if(j == k) return false;
	}
	return true;
}

template < typename T > inline void read(T &r) {
	r = 0; bool w = 0; char ch = getchar();
	while(ch < '0' || ch > '9') w = ch == '-', ch = getchar();
	while(ch >= '0' && ch <= '9') r = r * 10 + (ch ^ 48), ch = getchar();
	r = w ? - r : r;
}
void print(ll x) {
	if(x > 9) print(x / 10);
	cout << ((int) (x % 10));
}
void Main() {
//	x = (ll) 30011 * 30011 * 30011 * 30010;
	read(x);
	
//	ll Z = orz() % (T / 10000);
//	x = Z * (Z - 1) / 2;
//	while(x <= 1e18) x *= 2;
	if(x == 1) {
		cout << 1 << '\n';
		return ;
	}
	x *= 2;
	ll nx = x;
	int cnt = 0;
	while(nx % 2 == 0) nx /= 2, ++cnt;
	vector < ll > V, dc;
	L(tst, 0, 30) {
		ll rnd = orz() % x;
		ll z = qpow(rnd, nx, x);
		L(o, 0, cnt) {
			if(!z) break;
			ll k = gcd(z - 1, x);
			if(1 < k && k < x) dc.emplace_back(k); 
			if(o) z = Mul(z, z, x);
		}
	}
	sort(dc.begin(), dc.end());
	dc.erase(unique(dc.begin(), dc.end()), dc.end());
	V.emplace_back(x); 
	for(auto u : dc) {
		L(i, 0, sz(V) - 1) {
			ll G = __gcd(V[i], u);
			if(1 < G && G < V[i]) {
				V.emplace_back(V[i] / G), V[i] = G;
			}
		}
	}
	
	dc.clear();
	for(auto &z : V) {
		ll mxd = 0, Pw = 0;
		L(pw, 1, 62) {
			if((1LL << pw) > z) break;
			ll o = floor(pow(z, 1. / pw));
			if(o > 1 && fabs(pow((long double)o, pw) - z) < 0.1) 
				mxd = o, Pw = pw;
			++o;
			if(o > 1 && fabs(pow((long double)o, pw) - z) < 0.1) 
				mxd = o, Pw = pw;
		}
		L(i, 1, Pw) 
			dc.emplace_back(mxd);
	}
	swap(dc, V);
	sort(V.begin(), V.end());
	reverse(V.begin(), V.end());
//	for(auto &t : V) {
//		cout << t << ' ';
//	}
//	cout << endl;
	
	ll cx = x;
	ll ans = 1;
	for(auto z : V) {
		if((cx % z == 0) && MR(z)) {
			int cnt = 0;
			while(cx % z == 0) cx /= z, ++cnt;
			if((cx % (z - 1)) || !(cnt & 1)) {
				cout << -1 << '\n';
				return ;
			}
			cx /= z - 1;
			L(i, 1, (cnt + 1) / 2) ans *= z;
		}
	}
	if(cx != 1) {
		cout << -1 << '\n';
		return ;
	}
	print(ans), cout << '\n';
}
int main () {
	int t; read(t); while(t--) Main();
	return 0;
}
/*
20
21
475750381222420656586462245096576000
*/

詳細信息

Test #1:

score: 100
Accepted
time: 1ms
memory: 3696kb

input:

3
20
21
475750381222420656586462245096576000

output:

10
7
1497700821900508526

result:

ok 3 number(s): "10 7 1497700821900508526"

Test #2:

score: -100
Wrong Answer
time: 40ms
memory: 3492kb

input:

51
348387408908517538156281238966340503
269891120302452381431351214335847781
747207543121624879797402427368860
500118165772005573992050274078796601
376563350255195175098956276198783051
855996192374691515214841787085600
491448606692239765059794615991064231
123619467864337410141102480048000000
7114827...

output:

-1
-1
38657773487574029
-1
-1
41376351752391209
-1
819415677966571060
533472702079376326
419694411774324997
119851595982618319
24024477947405473
730267680763188643
269435681305057117
-1
293927240883277753
-1
475828352088697963
411968629840819787
-1
1000000018000000081
-1
-1
-1
-1
-1
1754669933639364...

result:

wrong answer 1st numbers differ - expected: '834730386302688203', found: '-1'