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 }
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 }
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 }
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 }