A题就是水题,直接按要求分类就行了。
#include<iostream>
#include<cstdio>
#include<cstring>
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<n;i++)
{
int x;
scanf("%d",&x);
if(x<0&&cnt1==0)
{
b1[cnt1++]=x;
}
else if(x<0&&cnt1==1)
{
b3[cnt3++]=x;
}
if(x>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<cnt2;i++)
printf("%d ",b2[i]);
printf("\n%d 0 ",cnt3+1);
for(int i=0;i<cnt3;i++)
printf("%d ",b3[i]);
printf("\n");
}
return 0;
}
B题的话我们先把必须在一个队的人标记成同一个数,然后对那些没有组队要求的人,我们也随意给他们分成几组(标记);然后我们检查一下,如果有哪个队的人数大于三或则是小于3就是不可能的情况,输出-1;其它情况按标记输出组队情况。代码写的有点乱
代码如下:
#include<iostream>
#include<cstring>
#include<cstdio>
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<iostream>
#include<cstdio>
#include<cstring>
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;
}
时间: 2024-10-10 07:34:45