杭电acm2049(http://acm.hdu.edu.cn/showproblem.php?pid=2049)

全错排列也用上了,调试的时候为什么老错
#include<stdio.h>
#include<math.h>

int f(__int64);
int main()
{
__int64 n,c,m,i,j,t;
while(scanf("%I64d",&c)!=EOF)
{
for(i=1;i<=c;i++)
{
t=0;
scanf("%I64d%I64d",&n,&m);
for(j=1;j<=m;j++)
t+=f(m)*pow((-1),j)/f(j);(这里是求全错排列)
t+=f(m);
t*=f(n)/(f(m)*f(n-m));
printf("%I64d\n",t);

}
}
return 0;
}

int f(__int64 x)
{
if(x==1||x==0) return 1;
else return x*f(x-1);
}

//这道应该是找出数学规律就好了嘛,以前A过的代码给你参考下
#include<iostream>
using namespace std;
int main()
{
int i,n;
__int64 s[21];
s[1]=0;
s[2]=1;
s[3]=2;
for(i=4;i<=20;i++)s[i]=(i-1)*(s[i-1]+s[i-2]);
cin>>n;
while(n-->0)
{
int a,b;
__int64 c=1,d=1,e=1;
cin>>a>>b;
for(i=a;i>0;i--)c*=i;
for(i=b;i>0;i--)d*=i;
for(i=a-b;i>0;i--)e*=i;
cout<<c/(d*e)*s[b]<<endl;
}
}
温馨提示:内容为网友见解,仅供参考
无其他回答

杭电2043哪里错了?http:\/\/acm.hdu.edu.cn\/showproblem.php?pid=2043
include<string.h> main(){ int a,b,c,d,i,j,k,e,q,w;char s[51];scanf("%d",&a);while(a){ b=0;c=0;d=0;k=0;e=0;a--;scanf("%s",s); \/\/ 用scanf比较安全, gets难处理.if(strlen(s)>16||strlen(s)<8) \/\/ 你忘了检测长度 { printf("NO\\n");continue;} fo...

...http:\/\/acm.hdu.edu.cn\/showproblem.php?pid=2048 怎么做的啊,求题...
这题是用错排思路做的 include<string.h> include<stdio.h> typedef __int64 lld;const lld MAX=25;double fac[MAX];double h[MAX];int main(){ lld n;lld i;h[0]=0;h[1]=0;h[2]=1;for(i=3;i<MAX;i++)h[i]=(i-1)*(h[i-1]+h[i-2]);fac[0]=1;for(i=1;i<MAX...

...http:\/\/acm.hdu.edu.cn\/showproblem.php?pid=2021
第一行输入老师人数n。接下来输入n个数,表示老师工资。最后输出所需要的最小张数。如果我没看错的话,你的程序是对一个老师就输出一次。题目要求的是给所有老师张数的最小总和。

http:\/\/acm.hdu.edu.cn\/showproblem.php?pid=2184 acm
include <stdlib.h> void hanoi(int a[],int b[],int c[],int n,double *m)\/*数组a[],b[],c[]分别代表三根柱子,第0个元素存放本柱子上的盘子数目,其余元素存放盘子编号,例如a[0]存放的是第一根柱子上的盘子数目。n是总盘子数目,m指针所指向的单元存放需要走的步数*\/ { if(*m>0...

http:\/\/acm.hdu.edu.cn\/showproblem.php?pid=2022
include<stdio.h> include<math.h> int main(){ int n,m,i,j,k,a[100][100],s1,s2;while(scanf("%d%d",&m,&n)!=EOF){ for(i=1;i<=m;i++){ for(j=1;j<=n;j++)scanf("%d",&a[i][j]);\/\/ printf("\\n"); \/\/ 这个换行莫名奇妙...} k=*(*(a+1)+1);s1=s2...

杭电acm1157 http:\/\/acm.hdu.edu.cn\/showproblem.php?pid=1157
你这程序自己都没测过吧?样例都过不了。1、题目中N (1 <= N < 10,000),你的数组长度才1000。2、数组的下标是从0开始,那么((N+1)\/2)是中位数的后一个数的下标。3、排序的时候你用a.length,这是一个固定值,而不是N,你这里是1000,这样就把数组中后面没用的值也参与进来排序了。

求高手详细讲解http:\/\/acm.hdu.edu.cn\/showproblem.php?pid=1003
例如:7 0 6 -1 1 -6 7 -5 分为三段7 0 6 -1 为第一段n1,1 -6 为第二段n2,7 -5为第三段n3。然后把n1,n2,n3用同样的方式分段,如此迭代,从而大大简化了数据量。最后用排列组合的方式求出最大的Sum,起始点为段的起始点。代码有时间另附。

...http:\/\/acm.hdu.edu.cn\/showproblem.php?pid=1089
所以 while( scanf("%d%d",&a,&b)==2) 就是判断是不是成功读取了2个数字 当scanf()遇到End-of-File的时候会特殊的返回-1,也就是EOF 所以 while(scanf("%d%d",&a,&b)!=EOF) 就是判断是不是还没有读到EOF 在这个题目里面,两种判断都是成立的 至于你提出的 while(scanf("%d%d",&...

人见人爱A^B http:\/\/acm.hdu.edu.cn\/showproblem.php?pid=2035
首先建议基础打好再做题 10000^3就已经超过了int范围,楼上的long10000^10也超过了,而题目要的是10000^10000,用double倒是可以,但是double的损失精度会让你的最后3位拿到的不准。所以直接做如同开玩笑一样。你上面的代码是a*b%c=(a%c)*(b%c)的一个优化形式 先给你讲朴素的做法:是用a*b%...

杭电ACM 新生晚会
对于N=30, M=15,你的程序肯定求出错误答案,不信你用计算器试试。因为你的中间步骤,temp1=temp1*n会溢出。网上有求组合数的模板,你不妨找一下,用起来又方便又正确。

相似回答
大家正在搜