Codeforces-Round#589 Div2

Posted tldr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces-Round#589 Div2相关的知识,希望对你有一定的参考价值。

A题 Distinct Digits

题解:

暴力水题

技术图片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int f[10];
 4 bool judge(int x)
 5 
 6     memset(f,0,sizeof(f));
 7     while(x)
 8         f[x%10]++;
 9         if(f[x%10]>1)return false;
10         x/=10;
11     
12     return true;
13 
14 int main()
15 
16     memset(f,0,sizeof(f));
17     int l,r;cin>>l>>r;
18     for(int i=l;i<=r;i++)
19     
20         if(judge(i))
21             cout<<i<<endl;
22             return 0;
23         
24     
25     cout<<-1<<endl;
26     return 0;
27 
View Code

B题 Filling the Grid

题解:

模拟水题,先按列放置黑色格子,外围一圈放上白色格子,

再按行放置黑色格子,若冲突则不成立。

技术图片
 1 #include<bits/stdc++.h>
 2 #define MAXN 2000
 3 #define ll long long
 4 
 5 using namespace std;
 6 const int MOD=1000000007;
 7 int dp[2000][2000];
 8 int main()
 9 
10     vector<int>r,c;
11     for(int i=0;i<MAXN;i++)
12     for(int j=0;j<MAXN;j++)
13         dp[i][j]=2;
14     int h,w;cin>>h>>w;
15     for(int i=0;i<h;i++)
16     
17         int num;cin>>num;
18         for(int j=1;j<=num;j++)
19         
20             dp[i+1][j]=1;
21         
22         dp[i+1][num+1]=0;
23     
24     for(int i=0;i<w;i++)
25     
26         int num;cin>>num;
27         for(int j=1;j<=num;j++)
28         
29             if(dp[j][i+1]==0)
30                 cout<<0<<endl;
31                 return 0;
32             
33             dp[j][i+1]=1;
34         
35         if(dp[num+1][i+1]==1)
36             cout<<0<<endl;
37             return  0;
38         
39         else dp[num+1][i+1]=0;
40     
41     ll ans=1;
42     for(int i=1;i<=h;i++)
43     
44         for(int j=1;j<=w;j++)
45         
46             if(dp[i][j]==0)continue;
47             ans=(ans*dp[i][j])%MOD;
48         
49     
50     cout<<ans%MOD<<endl;
51     return 0;
52 
View Code

C题 Primes and Multiplication

题解:

求n范围内质因子的个数和的次方的乘积

先求出x的质因子,然后从1-n范围内求出质因子的k次方的和

技术图片
 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 
 4 using namespace std;
 5 const ll MOD=1000000007;
 6 ll n,x;
 7 ll result  = 1;
 8 vector<int>prime;
 9 vector<ll> factor(ll n)
10     vector<ll>f;
11     for(ll i=2;i*i<=n;i++)
12         if(n%i==0)
13         
14             f.push_back(i);
15             while(n%i==0)
16                     n/=i;
17         
18         
19     if(n>1)
20         f.push_back(n);
21     return f;
22 
23 ll q_pow(ll a,ll b)
24     ll sum=1%MOD;
25     a%=MOD;
26         while(b)
27         
28             if(b&1)
29                 sum=(sum*1ll*a)%MOD;
30             a=a*1ll*a%MOD;
31             b>>=1;
32         
33     return sum;
34 
35 int main()
36 
37     cin>>x>>n;
38     vector<ll>prime=factor(x);//求质因子
39     ll ans=1;
40     for(int i = 0; i<prime.size(); i++)
41     
42         ll nn=n;
43         while(nn>=prime[i])
44             // cout<<nn/prime[i]<<endl;
45             ans=ans*q_pow(prime[i],nn/prime[i])%MOD;
46             // cout<<ans<<endl;
47             nn/=prime[i];
48         
49     
50     cout << ans%MOD << endl;
51     
52     return 0;
53 
View Code

D题 Complete Tripartite

题解:

暴力染色,先把所有的点放在集合1,遍历所有的点,颜色相同的联通点,把后一个点放入color++的集合。

判断:3个集合均有点,且没有点放在集合4;点图互相连通,即强连通图,m=v1*v2+v2*v3+v3*v1

技术图片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define MAXN 100010
 4 // typedef struct
 5 //     int from,to;
 6 //     int next,color;
 7 // EDGE;
 8 // EDGE edges[MAXN];
 9 typedef struct
10     int u,color;
11     set<int>v;
12 NODE ;
13 NODE nodes[MAXN];
14 int cnt=1,n,m;
15 int head[MAXN];
16 void add(int u,int v)
17 
18     nodes[u].v.insert(v);
19     nodes[v].color=2;
20 
21 int main()
22 
23     cin>>n>>m;
24     for(int i=0;i<m;i++)
25     
26         int a,b;scanf("%d%d",&a,&b);
27         add(a,b);
28         add(b,a);
29     
30     for(int i=0;i<MAXN;i++)
31         nodes[i].color=1;
32     for(int i=1;i<=n;i++)
33         for(int j:nodes[i].v)
34             if(nodes[i].color==nodes[j].color)
35             
36                 nodes[j].color++;
37             
38         
39     
40     int a[4]=0,0,0,0;
41     for(int i=1;i<=n;i++)
42         a[nodes[i].color]++;
43         if(nodes[i].color>3||nodes[i].v.empty())
44             cout<<"-1"<<endl;
45             return 0;
46         
47     
48     if(!a[1]||!a[2]||!a[3]||m!=(a[1]*a[2]+a[2]*a[3]+a[3]*a[1]))//判断是否是强连通图
49     
50         cout<<-1<<endl;
51         return 0;
52     
53     for(int i=1;i<=n;i++)
54     
55         cout<<nodes[i].color<<" ";
56     
57     
58 
59     return 0;
60 
View Code

 

以上是关于Codeforces-Round#589 Div2的主要内容,如果未能解决你的问题,请参考以下文章

CodeForces-Round524 A~D

Codeforces-Round#569 Div.2

CodeForces-Round235D

Codeforces-Round-#461-Div. 2-C

Codeforces-Round#547(Div.3)-C-Polycarp Restores Permutation

Codeforces-Round#546(Div.2)-D-Nastya Is Buying Lunch