2020-2021 Winter Petrozavodsk Camp, Day 5
链接:Dashboard - 2020-2021 Winter Petrozavodsk Camp, Day 5: Almost Retired Dandelion Contest (XXI Opencup, Grand Prix of Nizhny Novgorod) - Codeforces
J. Increasing or Decreasing
description
给出一个序列a,b。在不超过n次操作下,将a的一段连续区间降序或者升序排序,使得其等于序列b,输出方案
solution
先升序排,然后发现每次操作后,序列分为前后两部分升降序。
#include<bits/stdc++.h> using namespace std; int main(){ ios::sync_with_stdio(false); int n; cin>>n; vector<int>a(n+2),b(n+2); for(int i=1;i<=n;i++)cin>>a[i],a[i]=i; for(int i=1;i<=n;i++)cin>>b[i]; vector<tuple<int,int,int>>ans; ans.emplace_back(1,n,1); for(int i=1;i<=n;i++){ if(a[i]==b[i])continue; int r = find(a.begin()+i+1,a.end(),b[i])-a.begin(); if(a[i]<a[r]){ ans.emplace_back(i,r,0); sort(a.begin()+i,a.begin()+1+r,greater<>()); }else{ ans.emplace_back(i,r,1); sort(a.begin()+i,a.begin()+1+r); } } cout<<ans.size()<<endl; for(auto [x,y,z]:ans)cout<<x<<' '<<y<<' '<<(z?'I':'D')<<"\n"; }
G. Remove the Prime
description
对于序列a,每个人轮流进行操作:选择一个素数p和一个连续的序列(l, r),该序列中每个元素都可以整除p,然后将该序列每个元素除以p直至除不了。
solution
大数分解质因数。
nimi博弈:在n堆石子中,移除选择其中一堆任意石子。
#include<bits/stdc++.h> using namespace std; typedef long long ll; mt19937 rd((ll)(new int)); typedef __int128_t lll; // const int test_int[]={2,7,61}; const ll test[]={2,325,9375,28178,450775,9780504,1795265022}; ll qpow(ll x,ll n,ll mod){ ll c=1; for(x%=mod;n;n/=2,x=(lll)x*x%mod) if(n&1) c=(lll)c*x%mod; return c; } int miller_robin(ll n){ if (n<2||n%6%4!=1) return (n|1)==3; ll q=__builtin_ctzll(n-1),m=(n-1)>>q; for(ll a:test){ if(a>=n) break; ll x=qpow(a,m,n),x1,i=q; for(;i--&&x!=1;x=x1){ x1=(lll)x*x%n; if(x1==1&&x!=1&&x!=n-1) return 0; } if(x!=1) return 0; } return 1; } map<ll,ll> ans; ll pollard_rho(ll x){ ll s=0,t=0,c=rd()%(x-1)+1,d=1; for(ll val,step,g=1;d==1;g<<=1,s=t){ val=1; for(step=1;d==1&&step<=g;step++){ t=((lll)t*t+c)%x; val=(lll)val*abs(t-s)%x; if(step%100==0) d=__gcd(val,x); } d=__gcd(val,x); } return d; } void fac(ll n){ if(n<2) return; if(miller_robin(n)){ ans[n]++;return; } ll p=n; while(p>=n) p=pollard_rho(n); fac(n/p),fac(p); } void get_factor(ll n){ ans.clear(); fac(n); } int main(){ int n; cin>>n; map<ll,vector<ll>> yin; for(int i=1;i<=n;i++){ ll x;cin>>x; get_factor(x); for(auto [x,_]:ans){ yin[x].push_back(i); } } ll res=0; for(auto [_,pos]:yin){ ll t=0; for(int i=0;i<=pos.size();i++){ if(i==(int)pos.size()||(i&&pos[i]!=pos[i-1]+1)){ res^=t; t=1; }else t++; } } if(res)cout<<"First"; else cout<<"Second"; }
2022-03-03 22:57:32

浙公网安备 33010602011771号