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
题解:
模拟水题,先按列放置黑色格子,外围一圈放上白色格子,
再按行放置黑色格子,若冲突则不成立。
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
题解:
求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
题解:
暴力染色,先把所有的点放在集合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
以上是关于Codeforces-Round#589 Div2的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces-Round-#461-Div. 2-C