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

京公网安备 11010502036488号