Codeforces Round #630 (Div. 2)

A

思路是尽量折返走,但由于左右步数、上下步数的差值,所以最终位置也必须合法

#include <bits/stdc++.h>
using namespace std;

#define int long long

int t,a,b,c,d,x,y;

signed main() {
    ios::sync_with_stdio(false);
    cin>>t;
    while(t--) {
        cin>>a>>b>>c>>d>>x>>y;
        int x1,y1,x2,y2;
        cin>>x1>>y1>>x2>>y2;
        if(a-b>x-x1||b-a>x2-x||c-d>y-y1||d-c>y2-y||((a+b)&&x1==x2)||((c+d)&&y1==y2)) cout<<"No";
        else cout<<"Yes";
        cout<<endl;
    }
}

B

按最小质因子排序,然后贪心能选就选即可

#include <bits/stdc++.h>
using namespace std;

const int N = 1005;

struct item {
    int id,val,t;
    bool operator < (const item &b) {
        return t<b.t;
    }
} it[N];
int t,n,a[N],b[N],c[N],d[N];

signed main() {
    cin>>t;
    for(int i=2;i<=1000;i++) {
        for(int j=2;j<=i;j++) if(i%j==0) {
            b[i]=j;
            break;
        }
    }
    while(t--) {
        cin>>n;
        for(int i=1;i<=n;i++) cin>>a[i];
        for(int i=1;i<=n;i++) {
            it[i]={i,a[i],b[a[i]]};
        }
        sort(it+1,it+n+1);
        for(int i=1;i<=n;i++) a[i]=it[i].val;
        for(int i=1;i<=n;i++) c[i]=0;
        for(int i=1;i<=15;i++) {
            vector <int> vec;
            for(int j=1;j<=n;j++) if(c[j]==0) {
                int fg=1;
                for(int k:vec) if(__gcd(k,a[j])==1) fg=0;
                if(fg) vec.push_back(a[j]), c[j]=i;
            }
            if(vec.size()==0) {
                cout<<i-1<<endl;
                for(int j=1;j<=n;j++) d[it[j].id]=c[j];
                for(int j=1;j<=n;j++) cout<<d[j]<<" ";
                cout<<endl;
                break;
            }
        }
    }
}

C

构成串的 (n/k) 个单元必须都是回文串,暴力枚举半个单元,每一位相互独立,确定了半个单元后,整个串也就确定了

#include <bits/stdc++.h>
using namespace std;

int t,n,k;
const int N = 200005;
char s[N];
int a[N][26];

signed main() {
    cin>>t;
    while(t--) {
        cin>>n>>k>>s;
        for(int i=0;i<n;i++) for(int j=0;j<26;j++) a[i][j]=0;
        for(int i=0;i<n;i++) a[i%k][s[i]-'a']++;
        int ans=0;
        for(int i=0;i<k/2;i++) {
            int tans=1e9;
            for(int j=0;j<26;j++) {
                int tmp=2*(n/k)-a[i][j]-a[k-i-1][j];
                tans=min(tans,tmp);
            }
            ans+=tans;
        }
        if(k&1) {
            int tans=1e9;
            int i=k/2;
            for(int j=0;j<26;j++) {
                int tmp=(n/k)-a[i][j];
                tans=min(tans,tmp);
            }
            ans+=tans;
        }
        cout<<ans<<endl;
    }
}

D

构造 (2 imes 3) 矩阵如下(二进制)

[egin{matrix} 11 & 01 & 00 \ 10 & 11 & 01 end{matrix} ]

这样可以使得答案的差为 (1)。将最后一位替换成需要的数即可

#include <bits/stdc++.h>
using namespace std;

int k;

int main() {
    cin>>k;
    if(k==0) cout<<"1 1"<<endl<<"1"<<endl;
    else {
        int t=1;
        while(t<=k) t*=2;
        cout<<"2 3"<<endl<<t+k<<" "<<k<<" "<<0<<endl<<t<<" "<<t+k<<" "<<k<<endl;
    }
}

E

首先观察到,如果 (nm) 是奇数,一定合法;如果 (nm) 是偶数,则当且仅当 (sum_{(i,j)} a_{i,j}) 是偶数时合法

(nm) 是奇数的方案数位 ((r-l+1)^{nm})

(nm) 是偶数时,若 (r-l+1) 是偶数,则所有方案中总和奇偶各占据一半,故 ((r-l+1)^{nm}/2);若 (r-l+1) 是奇数,则显然总和为偶数的比总和为奇数的方案数多 (1),于是答案为 (((r-l+1)^{nm}+1)/2)

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 998244353;
int n,m,l,r,k;

int qpow(int p,int q) {
    return (q&1?p:1) * (q?qpow(p*p%mod,q/2):1) % mod;
}

signed main() {
    cin>>n>>m>>l>>r;
    k=r-l+1;
    if(n*m%2) cout<<qpow(k,n*m);
    else if(k&1) cout<<(qpow(k,n*m)+1)*((mod+1)/2)%mod;
    else cout<<(qpow(k,n*m))*((mod+1)/2)%mod;
}

原文地址:https://www.cnblogs.com/mollnn/p/12610156.html