B:https://codeforces.com/contest/1228/problem/B

题意:

一个n行m列的矩阵,输入n个数ai代表第i行前ai个方格都被涂黑,第ai+1没被涂黑,输入m个数bi代表第i列前bi个方格都被涂黑,第bi+1没被涂黑,问你方格的种类数

题解:

自己***没有看清样例,如果存在不符合的矩阵输出0,假如没有一个方格可以即为黑也为白,那答案就是1,不是0

代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod = 1e9+7;
const int maxx = 1010;
int a[maxx][maxx];

int main()
{
    int n,m,x;
    cin>>n>>m;
    int flag =0;
    for(int i=1;i<=n;i++){
        cin>>x;
        for(int j=1;j<=x;j++)
            a[i][j] = 1;
        a[i][x+1] = -1;
    }
    for(int i=1;i<=m;i++){
        cin>>x;
        for(int j=1;j<=x;j++){
            if(a[j][i] == -1){
                flag = 1;
            }
            a[j][i] = 1;
        }
        if(a[x+1][i] == 1){
            flag = 1;
        }
        a[x+1][i] = -1;
    }
    if(flag){
        cout<<"0"<<endl;
        return 0;
    }
    ll ans = 1;

    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(a[i][j] == 0){
                ans *= 2;
                ans %= mod;
            }
        }
    }
    cout<<ans<<endl;

    return 0;
}

C:https://codeforces.com/contest/1228/problem/C

题意:

题意化简一下就是让你求从1到m的所有数,是n的质因子的倍数的质因子的乘积

这里必须记一下如何不爆long long 处理数据

图片说明

代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod = 1e9+7;
const int maxx = 50010;
int a[maxx];
bool pri[maxx];
int p[maxx],n[maxx];
int cnt = 0,cnt1 = 0;
void prime()
{
    for(int i=2;i<=maxx;i++)
    {
        if(!pri[i])
            a[cnt1++] = i;
        for(int j=0;(j<cnt1 && (ll)i*a[j]<=maxx);j++)
        {
            pri[i*a[j]] = 1;
            if(i%a[j] == 0)
                break;
        }
    }
}
void solve(ll x)
{
    ll ans = 1;
    for(int i=0;a[i]*a[i] <= x;i++)
    {
        if(x%a[i] == 0)
        {
            p[++cnt] = a[i];
            n[cnt] = 0;
            while(x%a[i] == 0)
            {
                n[cnt]++;
                x /= a[i];
            }
        }
    }
    if(x!=1){
        p[++cnt] = x;
        n[cnt] = 1;
    }
    return ;
}
ll pow_mod(ll a,ll b)
{
    ll ans = 1;
    while(b){
        if(b&1)
           ans = ans*a%mod;
        a = a*a%mod;
        b>>=1;
    }
    return ans;
}
int main()
{
    ll n,m;
    cin>>n>>m;
    prime();
    solve(n);
    ll ans = 1;
    for(int i=1;i<=cnt;i++)
    {
        ll k = p[i];
        ll kk = p[i];
        int flag = 0;
        while(k <= m){
            ll now = m/k;
            //cout<<now<<endl;
            if(now < kk){
                flag = 1;
            }
            ans *= pow_mod(kk,now);
            ans %= mod;
            k *= kk;
            if(flag){
                break;
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}

D:https://codeforces.com/contest/1228/problem/D

题意:

问你是否能将一个图转换成三元图,每个集合的顶点都和另外俩个集合的每个顶点都有边相连,而且单个集合内不存在边相连

题解:

染色问题,最好自己手动涂一下颜色,从顶点1开始到顶点n,初始化每个顶点的颜色都是1,每个顶点和自己相邻的顶点颜色要不相同,所以遍历涂色,每个顶点的颜色和自己相邻的顶点如果颜色相同,那就需要将相邻的颜色涂成不一样的,最后判断,如果颜色超过三种,不行;如果每个顶点的度不等于另外俩颜色的个数,不行;涂色之和不等于n,不行

代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxx = 100005;
vector<int> v[maxx];
int clor[maxx],in[maxx];
int main()
{
    int n,m,x,y;
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        cin>>x>>y;
        v[x].push_back(y);
        v[y].push_back(x);
        in[x]++,in[y]++;
    }
    for(int i=1;i<=n;i++)
        clor[i] = 1;
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<v[i].size();j++){
            int k = v[i][j];
            if(clor[i] != clor[k]){
                continue ;
            }
            clor[k]++;
        }
    }
    int cnt1 = 0,cnt2 = 0,cnt3 = 0,flag = 0;
    for(int i=1;i<=n;i++){
        if(clor[i] == 1) cnt1++;
        if(clor[i] == 2) cnt2++;
        if(clor[i] == 3) cnt3++;
    }
    if(cnt1 == 0 || cnt2 == 0 || cnt3 == 0 || cnt1 + cnt2 + cnt3 != n ){
        cout<<"-1"<<endl;
        return 0;
    }
    for(int i=1;i<=n;i++){
        if(clor[i] == 1 && in[i] != n - cnt1) flag = 1;
        if(clor[i] == 2 && in[i] != n - cnt2) flag = 1;
        if(clor[i] == 3 && in[i] != n - cnt3) flag = 1;
    }
    if(flag){
        cout<<"-1"<<endl;
        return 0;
    }
    for(int i=1;i<=n;i++){
        cout<<clor[i]<<" ";
    }
    cout<<endl;
    return 0;
}

总结:
这场比赛毁在了B题,自己没推样例就写,自以为是,wa了不知道几法;
C题爆long long处理的不及时,下次直接提前写上