2022 CCPC威海补题记录

发布时间 2023-05-31 20:33:18作者: 笨竹子

L. Novice Magician

简单构造,但是读错了半年。

大意是构造一组方程有唯一解。

随便凑一个就行,没有任何讲究,不知道为啥没人过。

#include<bits/stdc++.h>
using namespace std;typedef long long ll;typedef long double ld;void ini();void solve();
const int mod=998244353;
//const int mod=1e9+7;
const ll inf=1e18;
int cases=0;
int main(){
    ini();
    ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
    cout<<fixed<<setprecision(6);
    int T;
    if(cases)cin>>T;else T=1;
    for(int tt=0;tt<T;tt++){
        solve();
    }
}
const int N=2112;
ll a[N],ans[N];int l[N],r[N];
void solve(){
    int m;cin>>m;
    int n=1<<m;
    if(n==2){
        cin>>a[0]>>a[1];
        cout<<"YES\n2\n";
        cout<<a[0]<<' '<<0<<'\n'<<a[1]<<' '<<1<<'\n';
        return;
    }
    ll s=0;
    for(int i=0;i<n;i++)cin>>a[i],s+=a[i];
    if(s%(n/2)){
        cout<<"NO\n";
        return;
    }
    cout<<"YES\n"<<n<<'\n';
    ll x=a[0];
    cout<<a[0]<<' ';for(int i=0;i<n/2;i++)cout<<i<<' ',a[i]-=x+i*2;cout<<'\n';
    x=(0+n-2)*(n/2)/2;
    ll vtot=0;
    for(int i=1;i<n;i++)a[i]-=x;
    for(int i=1;i<n;i++)vtot+=a[i];
    vtot/=n/2;
    for(int i=1;i<n;i++)l[i]=i,r[i]=(i+n/2-1)%(n-1)+1,ans[r[i]]=(a[i]+a[r[i]]-vtot);
    for(int i=1;i<n;i++){
        cout<<ans[i]<<' ';
        for(int j=l[i];j!=r[i];j=j%(n-1)+1)cout<<j<<' ';
        cout<<'\n';
    }
}
 
void ini(){}
View Code

注意点:

输出YES同时输出n个数,这会导致20罚时

2的时候需要特判,这会导致20+罚时

M. String Master

想补,待填。