随笔分类 -  数论

摘要:Ignatius and the Princess IIIProblem Description"Well, it seems the first problem is too easy. I will let you know how foolish you are later." feng5166 says."The second problem is, given an positive integer N, we define an equation like this:N=a[1]+a[2]+a[3]+...+a[m];a[i]>0,1<=m 阅读全文
posted @ 2012-04-17 20:08 龙杉老师
摘要:母函数详解在数学中,某个序列的母函数(Generating function,又称生成函数)是一种形式幂级数,其每一项的系数可以提供关于这个序列的信息。使用母函数解决问题的方法称为母函数方法。母函数可分为很多种,包括普通母函数、指数母函数、L级数、贝尔级数和狄利克雷级数。对每个序列都可以写出以上每个类型的一个母函数。构造母函数的目的一般是为了解决某个特定的问题,因此选用何种母函数视乎序列本身的特性和问题的类型。这里先给出两句话,不懂的可以等看完这篇文章再回过头来看:1.“把组合问题的加法法则和幂级数的乘幂对应起来”2.“母函数的思想很简单 — 就... 阅读全文
posted @ 2012-04-17 15:04 龙杉老师
摘要:^^^转载请注明出处,谢谢合作O(∩_∩)O~Be the WinnerLet's consider m apples divided into n groups. Each group contains no more than 100 apples, arranged in a line. You can take any number of consecutive apples at one time.For example "@@@" can be turned into "@@" or "@" or "@ 阅读全文
posted @ 2012-04-17 08:53 龙杉老师
摘要:^^^转载请注明出处,谢谢合作O(∩_∩)O~JohnProblem DescriptionLittle John is playing very funny game with his younger brother. There is one big box filled with M&Ms of different colors. At first John has to eat several M&Ms of the same color. Then his opponent has to make a turn. And so on. Please note that 阅读全文
posted @ 2012-04-17 00:13 龙杉老师
摘要:^^^转载请注明出处,谢谢合作O(∩_∩)O~取石子游戏 Problem Description1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍。取完者胜.先取者负输出"Second win".先取者胜输出"First win".Input输入有多组.每组第1行是2<=n<2^31. n=0退出.Output先取者负输出"Second win". 先取者胜输出"First win".参看Sample Output.Sample Input 阅读全文
posted @ 2012-04-16 23:24 龙杉老师
摘要:^^^转载请注明出处,谢谢合作O(∩_∩)O~取(2堆)石子游戏Problem Description有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。如果你胜,你第1次怎样取子?Input输入包含若干行,表示若干种石子的初始情况,其中每一行包含两个非负整数a和b,表示两堆石子的数目,a和b都不大于1,000,000,且a<=b。a=b=0退出。 阅读全文
posted @ 2012-04-15 20:21 龙杉老师
摘要:^^^转载请注明出处,谢谢合作O(∩_∩)O~Problem Descriptionm堆石子,两人轮流取.只能在1堆中取.取完者胜.先取者负输出No.先取者胜输出Yes,然后输出怎样取子.例如5堆 5,7,8,9,10先取者胜,先取者第1次取时可以从有8个的那一堆取走7个剩下1个,也可以从有9个的中那一堆取走9个剩下0个,也可以从有10个的中那一堆取走7个剩下3个.Input输入有多组.每组第1行是m,m<=200000. 后面m个非零正整数.m=0退出.Output先取者负输出No.先取者胜输出Yes,然后输出先取者第1次取子的所有方法.如果从有a个石子的堆中取若干个后剩下b个后会胜就 阅读全文
posted @ 2012-04-15 11:07 龙杉老师
摘要:^^^转载请注明出处,谢谢合作O(∩_∩)O~取石子游戏Problem Description有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。Input输入包含若干行,表示若干种石子的初始情况,其中每一行包含两个非负整数a和b,表示两堆石子的数目,a和b都不大于1,000,000,000。Output输出对应也有若干行,每行包含一个数字1或0,如果最 阅读全文
posted @ 2012-04-15 00:25 龙杉老师
摘要:^^^转载请注明出处,谢谢合作O(∩_∩)O~博弈论总结有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可。两个人轮流从堆中取物体若干,规定最后取光物体者取胜。这是我国民间很古老的一个游戏,别看这游戏极其简单,却蕴含着深刻的数学原理。下面我们来分析一下要如何才能够取胜。(一)巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。 显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜。因此我们发现了如何取胜的法则:如果n=(m+1)r+s, 阅读全文
posted @ 2012-04-14 21:40 龙杉老师
摘要:^^^转载请注明出处,谢谢合作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 龙杉老师
摘要:因为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 龙杉老师