2017.10.26 四校联测D1

题目比以前的题不知道高明到哪里去了,虽然std有错+数据有问题


T1 地精部落原题

#include
#include
using namespace std;
long long n,p,dowh,ans,i,f[2][5000][2],j;
int main()
{
	freopen("rabbit.in","r",stdin);
	freopen("rabbit.out","w",stdout);
	cin>>n>>p;
	dowh=1;
    f[0][1][0]=1;
    f[0][1][1]=1;
    f[0][2][1]=1;
	f[0][2][0]=1;
	for(i=3;i<=n;i++,dowh^=1)
	{
		for(j=1;j<=i;j++)
		f[dowh][j][0]=f[dowh^1][j][1];
		for(j=1;j<=i;j++)
		f[dowh][j][1]=f[dowh^1][j-1][0];
		if(i!=n)
		{
		for(j=i;j>=1;j--)
		f[dowh][j][1]=(f[dowh][j][1]+f[dowh][j+1][1])%p;
	    for(j=1;j<=i;j++)
		f[dowh][j][0]=(f[dowh][j][0]+f[dowh][j-1][0])%p;
}
	}
	dowh^=1;
	for(i=1;i<=n;i++)
	{
		ans+=f[dowh][i][0];
		ans%=p;
		ans+=f[dowh][i][1];
		ans%=p;
	}
	cout<


T2模拟:

#include
#include
using namespace std;
int T,n,m,i,j,tong[29];
char x;
int main()
{
	freopen("quilt.in","r",stdin);
		freopen("quilt.out","w",stdout);
	scanf("%d",&T);
	while(T--)
	{
		for(i=0;i<=25;i++)tong[i]=0;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)	
		for(j=1;j<=m;j++)
	{scanf("%c",&x);
	while(x<'a'||x>'z')scanf("%c",&x);tong[x-'a']++;
		}	
	bool keyi=1;
		if(n%2&&m%2)//双奇 
		{
	   for(i=1;i<=(m/2)*(n/2);i++)//4个的		
			{
			
				for(j=0;j<=25;j++)
			{
			if(tong[j]>=4)
			{
				tong[j]-=4;
			break;		
			}
			}	
				if(j==26)keyi=0;				
			}
			 for(i=1;i<=(m/2)+(n/2);i++)//2个的		
			{
			
				for(j=0;j<=25;j++)
			{
			if(tong[j]>=2)
			{
				tong[j]-=2;
			break;		
			}
			}	
				if(j==26)keyi=0;				
			}
		}else
		if(n%2==0&&m%2==0)//双偶 
		{
			
			   for(i=1;i<=(m/2)*(n/2);i++)//4个的		
			{
			
				for(j=0;j<=25;j++)
			{
			if(tong[j]>=4)
			{
				tong[j]-=4;
			break;		
			}
			}	
				if(j==26)keyi=0;				
			}	
		}else
		if(n%2)//n奇 
		{
			
			   for(i=1;i<=(m/2)*(n/2);i++)//4个的		
			{
			
				for(j=0;j<=25;j++)
			{
			if(tong[j]>=4)
			{
				tong[j]-=4;
			break;		
			}
			}	
				if(j==26)keyi=0;				
			}
						   for(i=1;i<=(m/2);i++)//2个的		
			{
				for(j=0;j<=25;j++)
			{
			if(tong[j]>=2)
			{
				tong[j]-=2;
			break;		
			}
			}	
				if(j==26)keyi=0;				
			}	
		}else//m奇 
		{
			
			   for(i=1;i<=(m/2)*(n/2);i++)//4个的		
			{
				for(j=0;j<=25;j++)
			{
			if(tong[j]>=4)
			{
				tong[j]-=4;
			break;		
			}
			}	
				if(j==26)keyi=0;				
			}
						   for(i=1;i<=(n/2);i++)//2个的		
			{
				for(j=0;j<=25;j++)
			{
			if(tong[j]>=2)
			{
				tong[j]-=2;
			break;		
			}
			}	
				if(j==26)keyi=0;				
			}	
		}	
		if(keyi)
		{
			cout<<"Yes\n";
		}else cout<<"No\n";
    }
}


T3dfs

#include
#include
#include
using namespace std;
#define N 5000005
int n,i,xia[N],hou[N<<1],zhong[N],d,q;
long long ni,f[N],ff[N],ans,sz[N],x,y,p,tot,lin=0;
bool bj[N];
#define P 1000000007
char xch,xB[1<<15],*xS=xB,*xTT=xB;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'|ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
void exgcd(int a,int m)
{
	if(m==0)
	{
		x=1;
		y=0;
		return;
	}
	exgcd(m,a%m);
long long	temp=y;
	y=x-a/m*y;
	x=temp;
}
void jian(int a,int b)
{
	++tot;hou[tot]=xia[a],xia[a]=tot,zhong[tot]=b;
}
void jia(int a,int b)
{
	jian(a,b);
	jian(b,a);	
}
void dfs(int o,int fa,int dis)
{
	int i,last=0;
	if(dis==d)bj[o]=1;
	for(i=xia[o];i!=-1;i=hou[i])
	{
		int nd=zhong[i];
		if(nd==fa)continue;
		dfs(nd,o,dis+1);
		sz[o]+=sz[nd];				
	last=nd;
	}
	if(last==0)
	{
		sz[o]=1;
		if(dis<=d)bj[o]=1;	
	}

}
void dfs1(int o,int fa)
{
	int i;
	if(bj[o])
	{
			for(i=xia[o];i!=-1;i=hou[i])
		{
		int nd=zhong[i];
			if(nd==fa)continue;
			ans=(ans+(sz[o]-sz[nd])*sz[nd]%P*p%P*ni%P)%P;
			tot+=(sz[o]-sz[nd])*sz[nd];
			tot%=P;//一个点独立的总数 
			//cout<


你可能感兴趣的:(小测)