组合数C(n,m)表示的是从n个物品中选出m个物品的方案数。举个例子,从(1, 2, 3)三个物品中选择两个物品可以有(1, 2),(1, 3),(2, 3)这三种选择方法。根据组合数的定义,我们可以给出计算组合数C(n,m)的一般公式:
C(n,m)=n!/(m!(n-m)!)
其中n!= 1×2×···×n。
小葱想知道如果给定n,m和k,对于所有的0≤i≤n,0≤j≤min(i,m)有多少对
|
(i,j)满足C(i,j)是k的倍数。
标签:人物 无法 通过 详细 cells 必须 mem 最优 init
|
题意还是baidu吧,这三道题,均交了一次,都是得了预期的分数,第一题就是普通求一个二维前缀和,第二题用了c++stl貌似会超时,第三题就是裸的状压dp吧。
问题 A 组合数问题
1 #include<cstdio> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstring> 5 #include<iostream> 6 7 using namespace std; 8 9 const int NN=2007; 10 11 int cas,k; 12 long long f[NN][NN],c[NN][NN]; 13 14 void init() 15 { 16 for (int i=1;i<=2000;i++) 17 { 18 c[i][1]=i%k; 19 for (int j=2;j<=i;j++) 20 c[i][j]=(c[i-1][j]+c[i-1][j-1])%k; 21 } 22 for (int i=1;i<=2000;i++) 23 for (int j=i+1;j<=2000;j++) 24 c[i][j]=-1; 25 for (int i=1;i<=2000;i++) 26 for (int j=1;j<=2000;j++) 27 { 28 if (c[i][j]==0) f[i][j]=1; 29 f[i][j]=f[i][j]+f[i][j-1]+f[i-1][j]-f[i-1][j-1]; 30 } 31 /*for (int i=1;i<=3;i++) 32 { 33 for (int j=1;j<=3;j++) 34 cout<<f[i][j]<<" "; 35 cout<<endl; 36 }*/ 37 } 38 int main() 39 { 40 scanf("%d%d",&cas,&k); 41 init(); 42 int x,y; 43 while (cas--) 44 { 45 scanf("%d%d",&x,&y); 46 printf("%lld\n",f[x][min(x,y)]); 47 } 48 }
问题 B 蚯蚓
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<queue> 5 #include<cmath> 6 #include<cstring> 7 #define ll long long 8 9 using namespace std; 10 11 int n,m,q,u,v,t,cnt; 12 ll ans[8000007],x,pluss; 13 priority_queue<ll> stack; 14 15 inline void make_out() 16 { 17 for (int i=1;i<cnt;i++) 18 cout<<ans[i]<<" "; 19 if (cnt!=0) cout<<ans[cnt]<<endl; 20 if (cnt==0) cout<<endl; 21 int num=0; 22 cnt=0; 23 while (!stack.empty()) 24 { 25 num++; 26 x=stack.top(); 27 stack.pop(); 28 x+=pluss; 29 if (num%t==0) ans[++cnt]=x; 30 } 31 for (int i=1;i<cnt;i++) 32 cout<<ans[i]<<" "; 33 cout<<ans[cnt]; 34 } 35 int main() 36 { 37 scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&t); 38 for (int i=1;i<=n;i++) 39 { 40 scanf("%lld",&x); 41 stack.push(x); 42 } 43 double p=(double)u*1.0/v; 44 for (int i=1;i<=m;i++) 45 { 46 x=stack.top(); 47 x=x+pluss; 48 stack.pop(); 49 if (i%t==0) ans[++cnt]=x; 50 ll y=(ll)(x*p+0.0000001),z=x-y; 51 y-=pluss,z-=pluss; 52 y-=q,z-=q; 53 stack.push(y),stack.push(z); 54 pluss=pluss+(ll)q; 55 } 56 57 make_out(); 58 }
问题 C 愤怒的小鸟
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cmath> 5 #include<iostream> 6 #include<queue> 7 #define NN 22 8 #define INF 1e9+7 9 10 using namespace std; 11 12 int n,m; 13 int dp[1<<NN],pre[NN][NN]; 14 double x[NN],y[NN]; 15 16 int solve() 17 { 18 int up=(1<<n); 19 for (int i=1;i<=up;i++) 20 dp[i]=INF; 21 dp[0]=0; 22 for (int k=0;k<up;k++) 23 { 24 int i; 25 for (i=0;i<n;i++) 26 if (((1<<i)&k)==0) break; 27 dp[k|(1<<i)]=min(dp[k|(1<<i)],dp[k]+1); 28 for (int j=1;j<=n;j++) 29 dp[k|pre[i+1][j]]=min(dp[k|pre[i+1][j]],dp[k]+1); 30 } 31 return dp[up-1]; 32 } 33 int main() 34 { 35 int Cas; 36 scanf("%d",&Cas); 37 while (Cas--) 38 { 39 scanf("%d%d",&n,&m); 40 for (int i=1;i<=n;i++) scanf("%lf%lf",&x[i],&y[i]); 41 memset(pre,0,sizeof(pre)); 42 for (int i=1;i<=n;i++) 43 for (int j=i+1;j<=n;j++) 44 { 45 double a=(y[j]*x[i]-y[i]*x[j])/((x[j]-x[i])*x[j]*x[i]); 46 double b=(y[j]*x[i]*x[i]-y[i]*x[j]*x[j])/((x[i]-x[j])*x[i]*x[j]); 47 if (a>=-0.0000001) continue; 48 for (int k=1;k<=n;k++) 49 if (fabs(a*x[k]*x[k]+b*x[k]-y[k])<=0.0000001) 50 pre[i][j]|=1<<(k-1); 51 } 52 printf("%d\n",solve()); 53 } 54 }
标签:人物 无法 通过 详细 cells 必须 mem 最优 init
原文地址:http://www.cnblogs.com/fengzhiyuan/p/7522725.html