随笔分类 - ACM
HDU解题报告
摘要:^^^转载请注明出处,谢谢合作O(∩_∩)O~功夫不负有心人,终于把这道题推出来了:即用排列组合加二项式定理,0-n/2个 A或C,剩下的填B、D,i和j都是偶数C(n,i)*C(n-i,j)*2^(n-i-j,);先计算当i=0时,C(n-i,j)*2^(n-i-j,)的值,得C(n,0)*2^n+C(n,2)*(2^n-2)+……+C(n,n-2)*2^2+C(n,n)*2^0;由于(2+1)^n和(2-1)^n有二项式展开定理分别展开再相加,再除以2,即得C(n,j)*2^(n-j,)的值为(3^n+1)/2;然后再求i=2,4……时C(n-i,j)*2^(n-i-j,)的值,最后得到表
阅读全文
posted @ 2012-04-10 21:56
龙杉老师
摘要:^^^转载请注明出处,谢谢合作O(∩_∩)O~青蛙的约会Description两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面。它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止。可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置。不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的。但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的。为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,会在什么时候碰面。我们把这两只青蛙分别叫做青蛙A和青蛙B,并且规定纬度线上
阅读全文
posted @ 2012-04-10 16:03
龙杉老师
摘要:此题为扩展欧几里得算法,代码如下:#include<iostream>using namespace std;int EE(int a,int b,int& x,int& y){ if(b==0) { x=1; y=0; return a; } int r=EE(b,a%b,x,y); int temp=x; x=y; y=temp-a/b*y; return r;}int main(){ int a,b,x,y,gcd; while(scanf("%d%d",&a,&b)!=EOF) { gcd...
阅读全文
posted @ 2012-04-09 23:46
龙杉老师
摘要:^^^转载请注明出处,谢谢合作O(∩_∩)O~A/B 扩展欧几里得算法Time Limit: 1000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others)Problem Description要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1)。Input数据的第一行是一个T,表示有T组数据。每组数据有两个数n(0 <= n < 9973)和B(1 <= B <= 10^9)。Output对应每组数据输出(A/B)%
阅读全文
posted @ 2012-04-08 23:39
龙杉老师
摘要:HDU 1003 : Max Sum Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum of a sub-sequence. For example, given (6,-1,5,4,-7), the max sum in this sequence is 6 + (-1) + 5 + 4 = 14.InputThe first line of the input contains an integer T(...
阅读全文
posted @ 2012-03-13 09:37
龙杉老师
摘要:续(1),现在写一个直接输入任意大于3的整数的程序,直接判断其是否为魔方阵,程序如下:#include<stdio.h>#include<string.h>#define M 100int main(){ int n,a[M][M]; void output(int a[][M],int n); void J_MFZ(int a[][M],int n); void SO_MFZ(int a[][M],int n); void DO_MFZ(int a[][M],int n); void check(int a[][M],int n); printf("...
阅读全文
posted @ 2012-03-10 22:42
龙杉老师
摘要:此题就是求n!,很明显只能用数组来写,不过数组要开大些,此题的Time Limit: 10000/5000 MS (Java/Others) ,下面是我的AC代码,勉强过:#include<stdio.h>//根据人手算 而得到的算法#include<string.h>#define M 40000 //数组要开大些 也不能太大 否则不能通过int main(){ int a[M],i,j,t,k,l,n; while(scanf("%d",&n)!=EOF) { memset(a,0,sizeof(a)); a[0]=1; ...
阅读全文
posted @ 2012-03-09 10:54
龙杉老师
摘要:《C程序设计(第四版)》 谭浩强的,第六章 第7题 有一个输出 魔方阵的题,相信困惑了不少人,下面本文给予大家完整的解答。所谓魔方阵即1-N*N个数排成一个n阶矩阵,矩阵特点:每一行,每一列,对角线之和都等于相同的值。下面根据资料总结得到:1):奇数的魔方阵:其数字排列规则如下: 1)将1填入第一行中间; 2)将每个数填在前一个数的右上方。 3)若该位置超出最上行,则改填在最下行的对应位置; 4)若该位置超出最右列,则该填在最左列的对应行位置; 5)若某元素填在第一行最右列,下一个数填在该数同列的下一行; 6)若某数已找到了填写位置,但其已填了其他数据,则这个数应填在应该填的位置...
阅读全文
posted @ 2012-03-08 16:37
龙杉老师
摘要:先来看一个例子,即赌徒输光问题:赌徒甲有资本a元,赌徒乙有资本b元,两人进行赌博,每赌一局输者给赢者1元,没有和局,直赌至两人中有一人输光为止。设在每一局中,甲获胜的概率为p,乙获胜的概率为q=1-p,求甲先输光的概率。 解:先设c=a+b; r=q/p;这个实际上是Markov过程(马尔科夫过程),具体细节不说了,结果就是:HDU1204 这道糖果大战,也是这类题目,下面是自己的AC代码:#include<stdio.h>#include<math.h>#define M 1e-12int main(){ double p,q,s,r; int a,b; while.
阅读全文
posted @ 2012-03-08 11:14
龙杉老师
摘要:qsort是C语言中用二分法进行的快速排序,其时间复杂度为n*log(n);库函数名为:#include<stdlib.h>基本形式为:qsort(a,n,sizeof(..),cmp);1:对整形数组排序例如a[5]={1,4,3,5,2};用函数qsort(a,5,sizeof(a[0]),cmp);其中cmp为 函数为cmp(const void *a,const void *b){return *(int *)a-*(int *)b;//要尽量强制转换类型}2:字符的排序其他和整形一样,函数为int cmp(const void *a,const void *b){retu
阅读全文
posted @ 2012-03-07 23:54
龙杉老师
摘要:因为0-9 的4次方的的末尾数为其本身,所以是以4为循环的,其代码为: #include<stdio.h> int main() { int n,i,s,t; scanf("%d",&t); while(t--) { scanf("%d",&n); s=1; for(i=1;i<=(n%4+4);i++) //+4是因为当n为4的倍数时 n%4=0 就不执行循环了 { s*=(n%10); s=s%10; } printf("%d\n",s); } ret...
阅读全文
posted @ 2012-03-07 23:52
龙杉老师