题目比以前的题不知道高明到哪里去了,虽然std有错+数据有问题
T1 地精部落原题
#include<iostream>
#include<cstdio>
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<<ans%p;
}
T2模拟:
#include<iostream>
#include<cstdio>
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<iostream>
#include<cstdio>
#include<cstring>
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<<endl<<" "<<(sz[o]-sz[nd])*sz[nd]<<" "<<p*ni<<" "<<(sz[o]-sz[nd])*sz[nd]*p*ni<<endl;
}
return;
}else
{
for(i=xia[o];i!=-1;i=hou[i])
{
int nd=zhong[i];
if(nd==fa)continue;
dfs1(nd,o);
}
}
}
void dfs2(int o,int fa)
{
if(bj[o])
{
f[o]=sz[o]; //对于叶子节点,f一开始存叶子个数
return;
}
int i,he=0;
for(i=xia[o];i!=-1;i=hou[i])
{
int nd=zhong[i];
if(nd==fa)continue;
dfs2(nd,o);
f[o]=(f[o]+f[nd]*p%P*ni%P)%P;//nd所有到nd的路径 一步到o
}
}
void dfs3(int o,int fa)//统计贡献
{
if(bj[o])
{
ans=(ans+sz[o]*ff[o]%P*p%P*ni%P)%P;
lin+=sz[o];
return ;
}
int i;
for(i=xia[o];i!=-1;i=hou[i])
{
int nd=zhong[i];
if(nd==fa)continue;
ff[nd]=(ff[o]+f[o]-f[nd]*p%P*ni%P+P)%P*p%P*ni%P;//ff处理f节点刀塔的信息
dfs3(nd,o);
}
}
void dfs4(int o,int fa)
{
int i;
if(bj[o])
{
tot+=(lin-sz[o])*sz[o];
tot%=P;
return;
}
for(i=xia[o];i!=-1;i=hou[i])
{
int nd=zhong[i];
if(nd==fa)continue;
dfs4(nd,o);
}
}
int main()
{
freopen("mosquito.in","r",stdin);
freopen("mosquito.out","w",stdout);
memset(xia,-1,sizeof(xia));
n=read();
for(i=1;i<n;i++)
{
x=read();
y=read();
jia(x,y);
}
d=read();
p=read();
q=read();
exgcd(q,P);
ni=x;tot=0;
// cout<<ni<<" ";
p=q-p;
dfs(1,0,0);
dfs1(1,0);
dfs2(1,0);
dfs3(1,0);
dfs4(1,0);
cout<<((tot-ans)%P+P)%P;
}