제출 #1200832

#제출 시각아이디문제언어결과실행 시간메모리
1200832Mighilon마술쇼 (APIO24_show)C++20
100 / 100
3 ms376 KiB
#include <bits/stdc++.h> using namespace std; #ifdef DEBUG #include "../Library/debug.h" #else #include "Alice.h" #define dbg(x...) #endif typedef long long ll; typedef long double ld; typedef pair<int, int> pi; typedef pair<ll, ll> pl; typedef vector<int> vi; typedef vector<bool> vb; typedef vector<ll> vl; typedef vector<pi> vpi; typedef vector<pl> vpl; #define FOR(i, a, b) for (int i = (a); i < (b); ++i) #define F0R(i, a) for (int i = 0; i < (a); ++i) #define FORd(i, a, b) for (inBobt i = (b) - 1; i >= (a); --i) #define F0Rd(i, a) for (int i = (a) - 1; i >= 0; --i) #define trav(a, x) for (auto& a : x) #define f first #define s second #define pb push_back #define sz(x) (int)(x).size() #define all(x) x.begin(), x.end() const char nl = '\n'; const int INF = 1e9; const ll MOD = 998244353; const int mxN = 3e5+5; #ifdef DEBUG mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); ll N, M; ll setN(ll x){ N=x; return M=uniform_int_distribution<ll>(int64_t(1e18),int64_t(1e18))(rng); } #endif void __print(__int128_t x){ if(x < 0){ putchar('-'); x = -x; } if(x>9) __print(x/10); putchar(x%10 + '0'); } vpi Alice(){ int n = 5000; ll x = setN(n); vpi res; FOR(i,2,n+1){ res.pb({(x%(i-1))+1,i}); } return res; } void print(__int128_t x){ if(x<0){ putchar('-'); x*=-1; } if(x>9)print(x/10); putchar(x%10 + '0'); } namespace BOB{ __int128_t ex_gcd(__int128_t a,__int128_t b,__int128_t& x,__int128_t& y){ if(b==0){ x=1; b=0; return a; } __int128_t x1=0,y1=0; __int128_t d=ex_gcd(b,a%b,x1,y1); x=y1; y=x1-a/b*y1; return d; } ll mul(ll a, ll b, ll m){ ll s=1; if(b<0)s=-1,b*=-1; ll ans=0; while(b>0){ if(b%2==1)ans=(ans+s*a)%m; b>>=1; a=(a+a)%m; } return ans; } ll Bob(vpi v){ ll num[19]; num[0]=1; F0R(i,18) num[i+1]=num[i]*10; auto check=[&](ll a, ll b){ int x=0,y=0; F0R(i,19)if(a<num[i]){ x=i; break; } if(a&&!x) x=19; if(b&&!y) y=19; F0R(i,19)if(b<num[i]){ y=i; break; } return (x+y)<=20; }; __int128_t res=0; __int128_t m=1; trav(i,v){ i.f-=1; i.s-=1; __int128_t x, y,d; d=ex_gcd(m,i.s,x,y); assert((res-i.f)%d==0); // if(!check(m,i.s)){ if(m > 1e18){ // dbg(m,i.s) return res; } // print(m); // dbg('-',res); res = res+(i.f-res)/d*x%(i.s/d)*m; // res = res + mul(mul((i.f-res)/d, x,(i.s/d)),m,(m/d*i.s)); m = m/d*i.s; res%=m; if(res<0)res+=m; } return res; } } #ifdef DEBUG int main(){ auto gen=[&](ll a, ll b){ return uniform_int_distribution(a,b)(rng); }; int cnt=0; while(1){ vpi edges = Alice(); shuffle(all(edges),rng); int rem=gen(1,N/2); edges.erase(edges.end()-rem, edges.end()); ll ans = BOB::Bob(edges); dbg(++cnt,ans, M); if(ans != M){ dbg(N,M,ans); return 0; } } return 1; } #endif
#include <bits/stdc++.h> using namespace std; #ifdef DEBUG #include "../Library/debug.h" #else #include "Bob.h" #define dbg(x...) #endif typedef long long ll; typedef long double ld; typedef pair<int, int> pi; typedef pair<ll, ll> pl; typedef vector<int> vi; typedef vector<bool> vb; typedef vector<ll> vl; typedef vector<pi> vpi; typedef vector<pl> vpl; #define FOR(i, a, b) for (int i = (a); i < (b); ++i) #define F0R(i, a) for (int i = 0; i < (a); ++i) #define FORd(i, a, b) for (int i = (b) - 1; i >= (a); --i) #define F0Rd(i, a) for (int i = (a) - 1; i >= 0; --i) #define trav(a, x) for (auto& a : x) #define f first #define s second #define pb push_back #define sz(x) (int)(x).size() #define all(x) x.begin(), x.end() const char nl = '\n'; const int INF = 1e9; const int MOD = 1e9 + 7; __int128_t ex_gcd(__int128_t a,__int128_t b,__int128_t& x,__int128_t& y){ if(b==0){ x=1; b=0; return a; } __int128_t x1=0,y1=0; __int128_t d=ex_gcd(b,a%b,x1,y1); x=y1; y=x1-a/b*y1; return d; } ll mul(ll a, ll b, ll m){ ll s=1; if(b<0)s=-1,b*=-1; ll ans=0; while(b>0){ if(b%2==1)ans=(ans+s*a)%m; b>>=1; a=(a+a)%m; } return ans; } ll Bob(vpi v){ ll num[19]; num[0]=1; F0R(i,18) num[i+1]=num[i]*10; auto check=[&](ll a, ll b){ int x=0,y=0; F0R(i,19)if(a<num[i]){ x=i; break; } if(a&&!x) x=19; if(b&&!y) y=19; F0R(i,19)if(b<num[i]){ y=i; break; } return (x+y)<=20; }; __int128_t res=0; __int128_t m=1; trav(i,v){ i.f-=1; i.s-=1; __int128_t x, y,d; d=ex_gcd(m,i.s,x,y); assert((res-i.f)%d==0); // if(!check(m,i.s)){ if(m > 1e18){ // dbg(m,i.s) return res; } // print(m); // dbg('-',res); res = res+(i.f-res)/d*x%(i.s/d)*m; // res = res + mul(mul((i.f-res)/d, x,(i.s/d)),m,(m/d*i.s)); m = m/d*i.s; res%=m; if(res<0)res+=m; } return res; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...