|
A题就是水题,直接按要求分类就行了。
#include
#include
#include
using namespace std; int main() { int n,cnt1,cnt2,cnt3,a[110]; int b1[110],b2[110],b3[110]; while(scanf("%d",&n)!=EOF) { cnt1=cnt2=cnt3=0; for(int i=0;i
0) { b2[cnt2++]=x; } } printf("1 %d\n",b1[0]); if(cnt2==0) { b2[cnt2++]=b3[--cnt3]; b2[cnt2++]=b3[--cnt3]; } printf("%d ",cnt2); for(int i=0;i
B题的话我们先把必须在一个队的人标记成同一个数,然后对那些没有组队要求的人,我们也随意给他们分成几组(标记);然后我们检查一下,如果有哪个队的人数大于三或则是小于3就是不可能的情况,输出-1;其它情况按标记输出组队情况。代码写的有点乱
代码如下:
#include
#include
#include
using namespace std; int M[50][50],vis[50]; int m,n; int dfs(int x,int cnt) { vis[x]=cnt; for(int i=1;i<=n;i++) if(M[x][i]) { M[x][i]=M[i][x]=0; dfs(i,cnt); } } int main() { while(scanf("%d%d",&n,&m)!=EOF) { memset(vis,0,sizeof(vis)); memset(M,0,sizeof(M)); for(int i=1;i<=m;i++) { int a,b; scanf("%d%d",&a,&b); if(a==b) continue; M[a][b]=1; M[b][a]=1; } int flag=0,cnt=0; for(int i=1;i<=n;i++) { int j; for(j=1;j<=n;j++) { if(M[i][j]) break; } if(j<=n) dfs(i,++cnt); } for(int i=1;i<=n/3;i++) { int d=0; for(int j=1;j<=n;j++) if(vis[j]==i) d++; if(d>3) { flag=1; break; } while(d<3) { for(int k=1;k<=n;k++) if(vis[k]==0) { vis[k]=i; break; } d++; } } for(int i=1;i<=n/3;i++) { int d=0; for(int j=1;j<=n;j++) { if(vis[j]==i) d++; } if(d<3) { flag=12; break; } } if(flag) { printf("-1\n"); continue; } for(int i=1;i<=n/3;i++) { for(int j=1;j<=n;j++) { if(vis[j]==i) printf("%d ",j); } printf("\n"); } } return 0; }
C题的话我们应该枚举(构造)结果,然后检查是否符合要求。然后的话就是一个排列组合的问题了。 注意一个公式:(a/b)%mod==a*pow(b,mod-2),mod是素数。这个公式可以用来快速算组合数。
代码如下:
#include
#include
#include
using namespace std; #define mod 1000000007 #define ll long long ll f[1000009]; ll pow(ll a,ll b) { ll ans=1; while(b) { if(b&1) ans=ans*a%mod; b>>=1; a=a*a%mod; } return ans%mod; } int a,b,n; bool check(ll x) { while(x) { int i=x%10; if(i!=a&&i!=b) return false; x/=10; } return true; } int main() { f[0]=1; for(int i=1;i<=1000001;i++) f[i]=f[i-1]*i%mod; while(scanf("%d%d%d",&a,&b,&n)!=EOF) { ll ans=0; for(int i=0;i<=n;i++) { ll sum=(ll)i*a+(ll)(n-i)*b; if(check(sum)) { ll d=f[i]*f[n-i]%mod; ans=(ans+f[n]*pow(d,mod-2)%mod)%mod; } } printf("%lld\n",ans); } return 0; }
|