题目比以前的题不知道高明到哪里去了,虽然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<