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处理的不及时,下次直接提前写上