D1T1玩具谜题
纯模拟过。
#include
#include
#include
#include
#include
#include
#define fr(i,a,b) for(int i=a,_end_=b;i<=_end_;i++)
#define fd(i,a,b) for(int i=a,_end_=b;i>=_end_;i--)
using namespace std;
int a,b,n,m,x,g[100010];
char name[100010][20];
int main()
{
freopen("toy.in","r",stdin);
freopen("toy.out","w",stdout);
scanf("%d%d",&n,&m);
fr(i,1,n)
scanf("%d%s",&g[i],&name[i]);//读入每个人的信息
x=1;//当前的小人
fr(i,1,m)
{
scanf("%d%d",&a,&b);
a^=g[x];//面朝外与面朝内的方向相反
a=a*2-1;//0->0*2-1=-1 1->1*2-1=1
x+=a*b;//直接乘
while(x<1)x+=n;//处理超界
while(x>n)x-=n;
}
printf("%s\n",name[x]);
return 0;
}
D2T1组合数问题
纯DP,DP 2次
一次求Cij,一次求答案。
C(x,y)=C(x−1,y)+C(x−1,y−1)
(注意mod)
即每次看最后元素,选与不选的情况。
f(x,y)=f(x−1,y)+f(x,y−1)−f(x−1,y−1)+(!c(x,y))
即计算(x,y)前共有多少个0。
#include
#include
#include
#include
#include
#include
#define fr(i,a,b) for(int i=a,_end_=b;i<=_end_;i++)
#define fd(i,a,b) for(int i=a,_end_=b;i>=_end_;i--)
using namespace std;
int t,k,f[2010][2010],c[2010][2010],n[10010],m[10010],maxn,maxm;
int main()
{
freopen("problem.in","r",stdin);
freopen("problem.out","w",stdout);
scanf("%d%d",&t,&k);
fr(i,1,t)
{
scanf("%d%d",&n[i],&m[i]);
maxn=max(maxn,n[i]);
maxm=max(maxm,m[i]);
}
memset(c,-1,sizeof(c));
fr(i,0,maxn)
c[i][0]=1;
fr(i,0,min(maxn,maxm))
c[i][i]=1;
fr(i,2,maxn)
fr(j,1,min(i-1,maxm))
c[i][j]=(c[i-1][j-1]+c[i-1][j])%k;
fr(i,1,maxn)
fr(j,1,maxm)
f[i][j]=f[i-1][j]+f[i][j-1]-f[i-1][j-1]+(!c[i][j]);
fr(i,1,t)
printf("%d\n",f[n[i]][m[i]]);
return 0;
}