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";
}
View Code

 

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";
}
View Code

 

2022-03-03 22:57:32

 

 
 
posted @ 2022-03-03 22:58  issleac  阅读(354)  评论(0)    收藏  举报