??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品乱码久久久久久蜜桃图片,久久久久久国产精品无码下载,中文字幕久久久久人妻http://www.shnenglu.com/MiYu/category/14445.html ______________白白の屋zh-cnSat, 18 Sep 2010 00:05:42 GMTSat, 18 Sep 2010 00:05:42 GMT60HDOJ 2147 HDU 2147 kiki's game ACM 2147 IN HDU http://www.shnenglu.com/MiYu/archive/2010/08/10/122978.htmlMiYuMiYuTue, 10 Aug 2010 12:48:00 GMThttp://www.shnenglu.com/MiYu/archive/2010/08/10/122978.htmlhttp://www.shnenglu.com/MiYu/comments/122978.htmlhttp://www.shnenglu.com/MiYu/archive/2010/08/10/122978.html#Feedback0http://www.shnenglu.com/MiYu/comments/commentRss/122978.htmlhttp://www.shnenglu.com/MiYu/services/trackbacks/122978.htmlMiYu原创, 转帖h?: 转蝲?______________白白の屋

题目地址:
         http://acm.hdu.edu.cn/showproblem.php?pid=2147
题目描述:
kiki's game

Time Limit: 
5000/1000 MS (Java/Others)    Memory Limit: 40000/1000 K (Java/Others)
Total Submission(s): 
1806    Accepted Submission(s): 1055


Problem Description
Recently kiki has nothing to 
do. While she is bored, an idea appears in his mind, she just playes the checkerboard game.The size of the chesserboard is n*m.First of all, a coin is placed in the top right corner(1,m). Each time one people can move the coin into the left, the underneath or the left-underneath blank space.The person who can't make a move will lose the game. kiki plays it with ZZ.The game always starts with kiki. If both play perfectly, who will win the game?
 

Input
Input contains multiple test cases. Each line contains two integer n, m (
0<n,m<=2000). The input is terminated when n=0 and m=0.

 

Output
If kiki wins the game printf 
"Wonderful!"else "What a pity!".
 

Sample Input
5 3
5 4
6 6
0 0
 

Sample Output
What a pity
!
Wonderful
!
Wonderful
!

题目分析:
一直WA , 分析也没分析出来 , 癑ֺ了一下别人的解题报告?............我承?...我被征服?....................

分析如下:
         

P点:是P个石子的时候,Ҏ拿可以赢(自己输的)

N点:是N个石子的时候,自己拿可以赢

现在关于P,N的求解有三个规则

Q?Q:最l态都是P

Q?Q:按照游戏规则Q到辑ֽ前态的前态都是N的话Q当前态是P

Q?Q:按照游戏规则Q到辑ֽ前态的前态至有一个P的话Q当前态是N

 

题意Q?/p>

在一个m*n的棋盘内Q从(1,m)点出发,每次可以q行的移动是Q左UMQ下UMQ左下移一。然后kiki每次先走Q判断kiki时候会赢(Ҏ无\可走的时候)?/p>

我们可以把PN状态的Ҏl出来:Q?/p>

                        

q些点的描绘有一个程序:Q?/p>

?/p>

#include<iostream>
using namespace std;
bool map[2001][2001];//1 P 0 N;
int main(){
       int i,j,k;
       map[1][1]=1;
       for(i=2;i<=2000;i++)
       {
              if(map[i-1][1])
                     map[i][1]=0;
              else map[i][1]=1;
              for(j=2;j<i;j++){
                     if(!map[i][j-1]&&!map[i-1][j-1]&&!map[i-1][j])
                            map[i][j]=1;
                     else map[i][j]=0;
              }
              if(map[1][i-1])
                     map[1][i]=0;
              else map[1][i]=1;
              for(j=2;j<i;j++){
                     if(!map[j-1][i]&&!map[j-1][i-1]&&!map[j][i-1])
                            map[j][i]=1;
                     else map[j][i]=0;
              }
              if(!map[i][i-1]&&!map[i-1][i-1]&&!map[i-1][i])
                     map[i][i]=1;
              else map[i][i]=0;
       }
       int M,N;
       for(i=1;i<=10;i++){
              for(j=1;j<=10;j++)
                     printf("%c ",map[i][j]?'P':'N');
              printf("\n");
       }
       while(scanf("%d%d",&M,&N)&&M&&N){
              if(map[M][N]) printf("What a pity!\n");
              else printf("Wonderful!\n");
       }
       return 0;
}

?/p>


具体代码如下:
#include <iostream>
using namespace std;
int main ()
{
    
int n,m;
    
while ( cin >> n >> m , n + m )
    {
          puts ( n
%2 && m % 2 ? "What a pity!" : "Wonderful!"); 
    }
    
return 0
}


MiYu 2010-08-10 20:48 发表评论
]]>
HDOJ HDU 2149 Public Sale ACM 2149 IN HDU http://www.shnenglu.com/MiYu/archive/2010/08/09/122863.htmlMiYuMiYuMon, 09 Aug 2010 14:22:00 GMThttp://www.shnenglu.com/MiYu/archive/2010/08/09/122863.htmlhttp://www.shnenglu.com/MiYu/comments/122863.htmlhttp://www.shnenglu.com/MiYu/archive/2010/08/09/122863.html#Feedback0http://www.shnenglu.com/MiYu/comments/commentRss/122863.htmlhttp://www.shnenglu.com/MiYu/services/trackbacks/122863.htmlMiYu原创, 转帖h?: 转蝲?______________白白の屋

题目地址:
         http://acm.hdu.edu.cn/showproblem.php?pid=2149
题目描述:
Public Sale

Time Limit: 
1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 
719    Accepted Submission(s): 419


Problem Description
虽然不想Q但是现实d是现实,Lele始终没有逃过退学的命运Q因Z没有拿到奖学金。现在等待他的,是像FarmJohn一L农田生?br>
要种田得有田才行QLele听说街上正在举行一场别开生面的拍卖会Q拍卖的物品正好是一?0亩的田地。于是,Lele带上他的全部U蓄Q冲往拍卖会?br>
后来发现Q整个拍卖会只有Lele和他的死对头Yueyue?br>
通过打听QLele知道q场拍卖的规则是q样的:刚开始底价ؓ0Q两个h轮流开始加P不过每次加h的幅度要?~N之间Q当h大于或等于田地的成本?nbsp;M Ӟd方就把这块田地卖l这ơ叫L人?br>
Lele和Yueyue虽然考试不行Q但是对拍卖却十分精通,而且他们两个人都十分惛_到这块田地。所以他们每ơ都是选对自己最有利的方式进行加仗?br>
׃Lele字典序比Yueyue靠前Q所以每ơ都是由Lele先开始加P请问Q第一ơ加L时候,
Lele要出多少才能保证自己买得到这块地呢?
 

Input
本题目包含多l测试,请处理到文gl束(EOF)。每l测试占一行?br>每组试包含两个整数M和N(含义见题目描qͼ
0<NQM<1100)
 

Output
对于每组数据Q在一行里按递增的顺序输出LeleW一ơ可以加的h。两个数据之间用I格隔开?br>如果Lele在第一ơ无论如何出价都无法买到q块土地Q就输出
"none"?br> 

Sample Input
4 2
3 2
3 5
 

Sample Output
1
none
3 4 5

题目分析:
单的Bash 博弈. 按题意控制好 输出 p?,    不清楚请点击  博弈入门

代码如下:
MiYu原创, 转帖h?: 转蝲?______________白白の屋

#include 
<iostream>
int main ()
{
    
int n,m;
    
while ( scanf ( "%d%d"&m, &n ) != EOF )
    {               
            
if ( m % ( n + 1 ) == 0 )
            {
                 puts ( 
"none" ); 
            }
            
else
            {
                 
if ( n >= m ) 
                 {
                      
for ( int i = m; i <= n; ++ i )
                      {
                            printf ( i 
== m ? "%d" : " %d",i );      
                      } 
                      putchar ( 
'\n' );
                 }
                 
else
                 {
                      printf ( 
"%d\n", m % ( n + 1 ) );
                 }    
            }
    } 
    
return 0
}


MiYu 2010-08-09 22:22 发表评论
]]>
HDOJ HDU 2188 悼念512汶川大地震遇隑֐胞——选拔志愿?ACM 2188 IN HDU http://www.shnenglu.com/MiYu/archive/2010/08/09/122851.htmlMiYuMiYuMon, 09 Aug 2010 13:37:00 GMThttp://www.shnenglu.com/MiYu/archive/2010/08/09/122851.htmlhttp://www.shnenglu.com/MiYu/comments/122851.htmlhttp://www.shnenglu.com/MiYu/archive/2010/08/09/122851.html#Feedback0http://www.shnenglu.com/MiYu/comments/commentRss/122851.htmlhttp://www.shnenglu.com/MiYu/services/trackbacks/122851.htmlMiYu原创, 转帖h?: 转蝲?______________白白の屋

题目地址:
         http://acm.hdu.edu.cn/showproblem.php?pid=2188
题目描述:
悼念512汶川大地震遇隑֐胞——选拔志愿?br>
Time Limit: 
1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 
1337    Accepted Submission(s): 716


Problem Description
对于四川同胞遭受的灾难,全国人民UL伸出援助之手Q几乎每个省市都zև了大量的救援人员Q这其中包括抢险救灾的武警部队,ȝ和防疫的L人员Q以及进行心理疏导的心理学专家。根据要求,我校也有一个奔赴灾区救灄名额Q由于广大师生报名踊跃,学校不得不进行选拔来决定最后的人选。经q多轮的考核QŞ劉K渐明朗Q最后的名额在“林队”?#8220;徐队”之间产生。但是很巧合Q?个h的简历几乎一模一Pq让L选拔?600很是为难。无奈,他决定通过捐款来决定两能入选?br>选拔规则如下Q?br>
1、最初的捐款是I的Q?br>2、两捐ƾ,每次捐款额必Mؓ正整敎ͼq且每h每次捐款最多不过m?1<=m<=10)?br>3、最先得LN辑ֈ或者超qn元(0<n<10000Q的一方ؓ胜者,则其可以亲ʎ灑֌服务?br>我们知道Q两人都很想入选志愿者名单,q且都是非常聪明的hQ假设林队先捐,请你判断谁能入选最后的名单Q?br> 

Input
输入数据首先包含一个正整数CQ表C包含Cl测试用例,然后是C行数据,每行包含两个正整数nQmQn和m的含义参见上面提到的规则?br> 

Output
对于每组试数据Q如果林队能入选,误出字W串
"Grass"Q?nbsp;如果徐队能入选,误出字W串"Rabbit"Q每个实例的输出占一行?br> 

Sample Input
2
8 10
11 10
 

Sample Output
Grass
Rabbit


题目分析:
非常非常标准?bash 博弈, 只要?捐款看成取款p? 谁最后取光钱谁就?  更多资料L?nbsp; 博弈入门

代码如下:
MiYu原创, 转帖h?: 转蝲?______________白白の屋

#include 
<iostream>
int main ()
{
    
int T;
    scanf ( 
"%d",&T );
    {
            
while ( T -- )
            {
                    
int n,m;
                    scanf ( 
"%d%d"&n, &m ); 
                    puts ( n 
% ( 1 + m ) != 0 ? "Grass" : "Rabbit" );  
            } 
    }
    
return 0
}


MiYu 2010-08-09 21:37 发表评论
]]>
HDOJ HDU 1847 Good Luck in CET-4 Everybody! ACM 1847 IN HDU http://www.shnenglu.com/MiYu/archive/2010/08/09/122845.htmlMiYuMiYuMon, 09 Aug 2010 13:27:00 GMThttp://www.shnenglu.com/MiYu/archive/2010/08/09/122845.htmlhttp://www.shnenglu.com/MiYu/comments/122845.htmlhttp://www.shnenglu.com/MiYu/archive/2010/08/09/122845.html#Feedback0http://www.shnenglu.com/MiYu/comments/commentRss/122845.htmlhttp://www.shnenglu.com/MiYu/services/trackbacks/122845.htmlMiYu原创, 转帖h?: 转蝲?______________白白の屋

题目地址:
    http://acm.hdu.edu.cn/showproblem.php?pid=1847
题目描述:
Problem Description
大学p四考试p来了,你是不是在紧张的复习Q也许紧张得q短学期的ACM都没工夫l习了,反正我知道的Kiki和Cici都是如此。当Ӟ作ؓ在考场润了十几蝲的当代大学生QKiki和Cici更懂得考前的放松,所?#8220;张弛有道”是q个意思。这不,Kiki和Cici在每天晚上休息之前都要玩一会儿扑克牌以放松经?br>“升”Q?#8220;双扣”Q?#8220;U五”Q还?#8220;斗地?#8221;Q?br>当然都不是!那多俗啊
~
作ؓ计算机学院的学生QKiki和Cici打牌的时候可没忘C业,她们打牌的规则是q样的:
1?nbsp; dn张牌;
2?nbsp; 双方轮流抓牌Q?br>3?nbsp; 每h每次抓牌的个数只能是2的幂ơ(卻I1Q?/span>2Q?/span>4Q?/span>8Q?/span>16…Q?br>4?nbsp; 抓完牌,胜负l果也出来了Q最后抓完牌的h者;
假设Kiki和Cici都是_聪明Q其实不用假设,哪有不聪明的学生
~Q,q且每次都是Kiki先抓牌,请问谁能赢呢Q?br>当然Q打牌无赢都问题不大Q重要的是马上到来的CET-4能有好的状态?br>
Good luck 
in CET-4 everybody!
 

Input
输入数据包含多个试用例Q每个测试用例占一行,包含一个整数nQ?/span>1<=n<=1000Q?br> 

Output
如果Kiki能赢的话Q请输出“Kiki”Q否则请输出“Cici”Q每个实例的输出占一行?br> 

Sample Input
1
3
 

Sample Output
Kiki
Cici

题目分析:
MiYu原创, 转帖h?: 转蝲?______________白白の屋

首先我们可以惛_在面?的时候是必|局Q谁面对3时无论拿多少都会?!  <---q是关键
那么p量造成q样的局势给ҎQ因ZQ何不?的倍数的数??都可以变?的倍数Q?br>同理减去1?也可以变?的倍数Q也是说假讄前的个数不是3的倍数Q那我肯定能把它
拿成3的倍数Q比如现在是11个,那我拿走2个就变成9Q这样就造成Ҏ?的倍数局势,?br>么对Ҏm个我都可以通过?或?使d一轮拿的数目成?的倍数Q这样就会有两种情况:
   1.刚好拿完.
   2.剩下的还?的倍数个,那l?
所以这h下去必胜

代码如下:
MiYu原创, 转帖h?: 转蝲?______________白白の屋

#include 
<iostream>
using namespace std;
int main ()
{
    
int N;
    
while ( cin >> N )
    {
          puts ( N 
% 3 != 0 ? "Kiki" : "Cici" ); 
    }
    
return 0
}


MiYu 2010-08-09 21:27 发表评论
]]>
HDOJ HDU 1849 Rabbit and Grass ACM 1849 IN HDU http://www.shnenglu.com/MiYu/archive/2010/08/09/122844.htmlMiYuMiYuMon, 09 Aug 2010 13:09:00 GMThttp://www.shnenglu.com/MiYu/archive/2010/08/09/122844.htmlhttp://www.shnenglu.com/MiYu/comments/122844.htmlhttp://www.shnenglu.com/MiYu/archive/2010/08/09/122844.html#Feedback0http://www.shnenglu.com/MiYu/comments/commentRss/122844.htmlhttp://www.shnenglu.com/MiYu/services/trackbacks/122844.htmlMiYu原创, 转帖h?: 转蝲?______________白白の屋

题目地址:
         http://acm.hdu.edu.cn/showproblem.php?pid=1849
题目描述:
Problem Description
大学时光是浪漫的Q女生是O的,圣诞更是O的,但是Rabbit和Grassq两个大学女生在今年的圣诞节却表现得一炚w不浪漫:不去逛商场,不去逛公园,不去和ACL会,两个人竟然猫在寝食下?#8230;…
说是下棋Q其实只是一个简单的游戏而已Q游戏的规则是这LQ?br>
1?nbsp; 盘包含1*n个方|Ҏ从左到右分别~号?Q?/span>1Q?/span>2Q?#8230;Qn-1Q?br>2?nbsp; m个棋子放在棋盘的Ҏ上,Ҏ可以为空Q也可以攑֤于一个的子Q?br>3?nbsp; 双方轮流走棋Q?br>4?nbsp; 每一步可以选择L一个棋子向左移动到L的位|(可以多个子位于同一个方|Q当ӞM子不能出盘边界Q?br>5?nbsp; 如果所有的子都位于最左边Q即~号?的位|)Q则游戏l束Qƈ且规定最后走的一方ؓ胜者?br>
对于本题Q你不需要考虑n的大(我们可以假设在初始状态,子L位于盘的适当位置Q。下面的C意囑֍Z?
*15的棋盘,共有6个棋子,其中Q编?的位|有两个子?br>
                                                                                       


大家知道Q虽然偶不够浪漫,但是Rabbit和Grass都是冰雪聪明的女生,如果每次都是Rabbit先走,误出最后的l果?br> 

Input
输入数据包含多组试用例Q每个测试用例占二行Q首先一行包含一个整数mQ?/span>0<=m<=1000Q,表示本测试用例的子数目Q紧跟着的一行包含m个整数Ki(i=1…m; 0<=Ki<=1000)Q分别表Cm个棋子初始的位置Qm=0则结束输入?br> 

Output
如果Rabbit能赢的话Q请输出“Rabbit Win
!”Q否则请输出“Grass Win!”Q每个实例的输出占一行?br> 

Sample Input
2 
3 5
3
3 5 6
0
 

Sample Output
Rabbit Win
!
Grass Win
!

题目分析 :
MiYu原创, 转帖h?: 转蝲?______________白白の屋

标准 ?nim 博弈 问题, 不要惛_杂了 .   因ؓ只能往左移, 所以可以将 初始的每个棋子的位置看成一个堆, 比如? 1个棋子在 n-1? 那么׃表这个堆?n-1个数
左移1?是取走一? 所以有 m 子׃表有m个堆, 全部?是取完?...........    更具体的 nim 博弈介绍L?nbsp; << 博弈入门 >> 

代码如下:
MiYu原创, 转帖h?: 转蝲?______________白白の屋

#include 
<iostream>
int heap[1001];
int main ()
{
    
int T;
    
while ( scanf ( "%d",&T ), T )
    {
            
int res = 0 , nCount = 0;
            
for ( int i = 0; i != T; ++ i )
            {
                  scanf ( 
"%d",heap + i );
                  res 
^= heap[i]; 
            }
            puts ( res 
== 0 ? "Grass Win!" : "Rabbit Win!" );
    }
    
return 0
}


MiYu 2010-08-09 21:09 发表评论
]]>
HDOJ HDU 1846 Brave Game ACM 1846 IN HDU http://www.shnenglu.com/MiYu/archive/2010/08/09/122836.htmlMiYuMiYuMon, 09 Aug 2010 12:35:00 GMThttp://www.shnenglu.com/MiYu/archive/2010/08/09/122836.htmlhttp://www.shnenglu.com/MiYu/comments/122836.htmlhttp://www.shnenglu.com/MiYu/archive/2010/08/09/122836.html#Feedback0http://www.shnenglu.com/MiYu/comments/commentRss/122836.htmlhttp://www.shnenglu.com/MiYu/services/trackbacks/122836.htmlMiYu原创, 转帖h?: 转蝲?______________白白の屋

题目地址:
         http://acm.hdu.edu.cn/showproblem.php?pid=1846
题目描述:
Problem Description
十年前读大学的时候,中国每年都要从国外引q一些电影大片,其中有一部电影就叫《勇敢者的游戏》(英文名称QZathuraQ,一直到现在Q我依然对于电媄中的部分电脑Ҏ印象深刻?br>今天Q大安择上机考试Q就是一U勇敢(braveQ的选择Q这个短学期Q我们讲的是博弈QgameQ专题;所以,大家现在玩的也是“勇敢者的游戏”Q这也是我命名这个题目的原因?br>当然Q除?#8220;勇敢”Q我q希望看?#8220;诚信”Q无试成W如何Q希望看到的都是一个真实的l果Q我也相信大家一定能做到?/span>~

各位勇敢者要玩的W一个游戏是什么呢Q很单,它是q样定义的:
1?nbsp; 本游戏是一个二人游?
2?nbsp; 有一堆石子一共有n个;
3?nbsp; 两h轮流q行;
4?nbsp; 每走一步可以取?…m个石子;
5?nbsp; 最先取光石子的一方ؓ胜;

如果游戏的双方用的都是最优策略,误出哪个h能赢?br> 

Input
输入数据首先包含一个正整数C(C
<=100)Q表C有Cl测试数据?br>每组试数据占一行,包含两个整数n和mQ?/span>1<=n,m<=1000Q,n和m的含义见题目描述?br> 

Output
如果先走的h能赢Q请输出“first”Q否则请输出“second”Q每个实例的输出占一行?br> 

Sample Input
2
23 2
4 3
 

Sample Output
first
second

题目分析:

巴什博弈Q一个h?~m个,那谁面对m+1的局势的的时候则必|Q很明显Q先拿的是要造这个局?如果n?m+1)*r+s(kZQ意,s<m+1),那么很明昑օ拿的拿掉s后,然后无论下一个拿多少你都可以保证你拿完后都是拿了m+1个,q样后拿的必定面对必败局势,比如23 2Q?3=Q?×7Q?2Q那我第一ơ拿?Q然后无论每ơ第二个拿几我都可以使得q轮d?Q然后他必定会面?q个局势,然后我就必胜Q那什么时候必败呢Q很明显如果我面对的是(m+1Q的倍数的局势就必|?br>puts ( n % ( 1 + m ) != 0 ? "first" : "second" );

l果竟然被这题给阴了....while(scanf("%d",&c)!=EOF) --> l果WA, YM
然后Ҏ  scanf("%d",&c)  居然 AC ? ...................悲剧~~?/p>


代码如下 :
MiYu原创, 转帖h?: 转蝲?______________白白の屋

#include <iostream>
int main ()
{
    int T;
    scanf ( "%d",&T );
    {
            while ( T -- )
            {
                    int n,m;
                    scanf ( "%d%d", &n, &m );
                    puts ( n % ( 1 + m ) != 0 ? "first" : "second" ); 
            }
    }
    return 0;
}


MiYu 2010-08-09 20:35 发表评论
]]>
HDOJ HDU 1850 Being a Good Boy in Spring Festival ACM 1850 IN HDU http://www.shnenglu.com/MiYu/archive/2010/08/09/122830.htmlMiYuMiYuMon, 09 Aug 2010 12:04:00 GMThttp://www.shnenglu.com/MiYu/archive/2010/08/09/122830.htmlhttp://www.shnenglu.com/MiYu/comments/122830.htmlhttp://www.shnenglu.com/MiYu/archive/2010/08/09/122830.html#Feedback0http://www.shnenglu.com/MiYu/comments/commentRss/122830.htmlhttp://www.shnenglu.com/MiYu/services/trackbacks/122830.htmlMiYu原创, 转帖h?: 转蝲?______________白白の屋

题目地址:
         http://acm.hdu.edu.cn/showproblem.php?pid=1850
题目描述:
Problem Description
一q在?nbsp;父母时刻牉|
春节回家 你能做几天好孩子?br>寒假里尝试做做下面的事情?br>
陪妈妈逛一ơ菜?br>悄悄l爸怹个小C物
d?nbsp;强烈?nbsp;要求z一ơ碗
某一天早?nbsp;l爸妈用心地做回早餐

如果愿意 你还可以和爸妈说
׃玩个游戏吧 ACM课上学的呢~

下面是一个二人小游戏Q桌子上有M堆扑克牌Q每堆牌的数量分别ؓNi(i
=1…M)Q两进行;每走一步可以Q意选择一堆ƈ取走其中的Q意张牌;桌子上的扑克全部取光Q则游戏l束Q最后一ơ取牌的Zؓ胜者?br>现在我们不想研究到底先手q是Q我只想问大Ӟ
—?#8220;先手的h如果惌Q第一步有几种选择呢?”
 

Input
输入数据包含多个试用例Q每个测试用例占2行,首先一行包含一个整数M(
1<M<100)Q表C扑克牌的堆敎ͼ紧接着一行包含M个整数Ni(1<=Ni<=1000000Qi=1…M)Q分别表CM堆扑克的数量。M?则表C入数据的l束?br> 

Output
如果先手的h能赢Q请输出他第一步可行的Ҏ敎ͼ否则误?Q每个实例的输出占一行?br> 

Sample Input
3
5 7 9
0
 

Sample Output
1

题目分析 :

MiYu原创, 转帖h?: 转蝲?______________白白の屋

一.
      如果a1^a2^a3^...^an=0 ( ?: nim-sum=0 ) , 说明先手没有必赢{略, Ҏ数肯定ؓ 0;
?

      假设先手的h有必赢策略?/p>

            问题则{化ؓ=>在Q意一堆拿LK张牌Qƈ且剩下所有堆的nim-sum=0(P-position)的方案L?/p>

                     1. 现在我们先看一个例?5,7,9)Qƈ假设从第一堆取LK张牌?/p>

                              排除W一堆牌的nim-sum?7^9=14

                                            0111

                                          ^1001

                                          -------

                                            1110

                              如果要所有堆的nim-sum=0成立Q则W一堆取掉K张以后必定ؓ1110Q因为X^X=0?/p>

                              所以要观察 5-k=14 k>0 成立,此例?在第一堆取LK张牌)明显的不成立。但q不代表在第二或W三堆取LK张牌的解不成立?/p>

                     2. 现在看第二个例子(15,7,9)Qƈ假设从第一堆取LK张牌?/p>

                              排队W一堆牌的nim-sum?^9=14Q和W一个例子相同,所以问题变?15-k=14 k>0 是否成立?/p>

                              当然q个例子是成立的?/p>

?
      ȝ得出Q?/p>

            在Q意一堆拿LK张牌Qƈ且所有堆的nim-sum=0 成立的条件ؓQ排除取掉K张牌的那一堆的nim-sum必须于该堆牌上的数?例子?Q否则不能在此堆上取LK张牌使所有堆的nim-sum=0成立(例子一)?/p>

            故L案数?( 在Q意一堆拿LK张牌Qƈ且所有堆的nim-sum=0 成立 ) 的L?/p>


代码如下 :
MiYu原创, 转帖h?: 转蝲?______________白白の屋

#include 
<iostream>
int heap[101];
int main ()
{
    
int T;
    
while ( scanf ( "%d",&T ), T )
    {
            
int res = 0 , nCount = 0;
            
for ( int i = 0; i != T; ++ i )
            {
                  scanf ( 
"%d",heap + i );
                  res 
^= heap[i]; 
            }
            
if ( res == 0 )
            {
                 puts ( 
"0" ); 
                 
continue;
            }
            
int cmp = 0;
            
for ( int i = 0; i != T; ++ i )
            {
                  cmp 
= res ^ heap[i];
                  
if ( cmp < heap[i] )
                  {
                       nCount 
++
                  } 
            }
            printf ( 
"%d\n",nCount );
    }
    
return 0
}


MiYu 2010-08-09 20:04 发表评论
]]>
HDOJ HDU 2897 邂逅明?ACM 2897 IN HDU http://www.shnenglu.com/MiYu/archive/2010/08/09/122756.htmlMiYuMiYuMon, 09 Aug 2010 03:59:00 GMThttp://www.shnenglu.com/MiYu/archive/2010/08/09/122756.htmlhttp://www.shnenglu.com/MiYu/comments/122756.htmlhttp://www.shnenglu.com/MiYu/archive/2010/08/09/122756.html#Feedback0http://www.shnenglu.com/MiYu/comments/commentRss/122756.htmlhttp://www.shnenglu.com/MiYu/services/trackbacks/122756.htmlMiYu原创, 转帖h?: 转蝲?______________白白の屋

题目地址:
         http://acm.hdu.edu.cn/showproblem.php?pid=2897
题目描述:
Problem Description
当日遇到月,于是有了明。当我遇C你,便成了G?br>那天Q日月相会,我见C你。而且Q大地失M光辉Q你我是否成侣?q注定是个凄的故事。(以上是废话)
t和所有世俗的Z一P期待那百q难遇的日食。驻头看天,看日月渐渐走q,t的脖子那个酸呀Q他坚持q个姿势已经有半个多时啦)。他低下仰v的头Q环֛周。忽然发现n边竟站着位漂亮的mm。天渐渐暗下Q这mm在这街头竟然如此耀|Ҏ天吗?站着tw边的天ѝ?br>t对mm惊呼Q?#8220;~分?/span>~~”。mm却毫不含p:“是啊Q?00q一遇哦Q?#8221;Q此后省?000?#8230;.Q?br>t赶紧向mm要联pL式,可mm_“我和你玩个游戏吧Q赢了,我就把我的手机号告诉你?#8221;tQ心惛_下哪有题目能隑ր我呢,便满口答应下来。mm开始说游戏规则Q?#8220;我有一堆硬币,一?枚,从这个硬币堆里取币Q一ơ最取2枚,最?枚,如果剩下于2枚就要一ơ取完。我和你轮流取,直到堆里的硬币取完,最后一ơ取币的算输。我玩过q个游戏好多ơ了Q就让让你,让你先取?/span>~
t掐指一,不对呀Q这是不可能的Q务么。小t露出得意的笑Q?#8220;q是mm优先啦,呵呵
~”mm霎时愣住了,x对小t的反应出乎意料吧?br>她却也不生气Q?#8220;好小子,明呢Q要不这样吧Q你把我的邮q我,我给你发个文本,每行有三个数字nQpQqQ表CZ堆硬币一共有n枚,从这个硬币堆里取币Q一ơ最取p枚,最多q枚,如果剩下于p枚就要一ơ取完。两取Q直到堆里的币取完Q最后一ơ取币的算输。对于每一行的三个数字Q给出先取的人是否有必胜{略Q如果有回答WINQ否则回{LOST。你把对应的{案发给我,如果你能在今天晚?点以前发l我正确{案Q或许我们明天下午可以再见?#8221;
t二话没说Q将自己的邮q了mm。当他兴冲冲得赶回家Q上|看邮箱Q哇Qmm的邮件已l到了。他发现文本长达100000行,每行的三个数字都很大Q但是都是不过65536的整数。小t看表已经下午6点了Q要x工算出所有结果,看来是不可能了。你能帮帮他Q让他再见到那个mm吗?
 

Input
不超q?00000行,每行三个正整数nQpQq?br> 

Output
对应每行输入Q按前面介绍的游戏规则,判断先取者是否有必胜{略。输出WIN或者LOST?br> 

Sample Input
7 2 4
6 2 4
 

Sample Output
LOST
WIN


博弈的入门题, 巴什博奕(Bash Game), 具体了解L?nbsp; 博弈入门  .

代码如下:
MiYu原创, 转帖h?: 转蝲?______________白白の屋

#include 
<iostream>
int main ()
{
       
int N, p, q;
       
while ( scanf ( "%d%d%d",&N, &p, &q ) != EOF )
       {
            
int res = N % ( p + q );
            puts ( res 
? res <= p ? "LOST" : "WIN" : "WIN" );
    }
       
return 0;    
}

另外UU自己的一行代?:
MiYu原创, 转帖h?: 转蝲?______________白白の屋

main(p,q){
int N,res;while(~scanf("%d%d%d",&N,&p,&q)){res=N%(p+q);puts(res?res<=p?"LOST":"WIN":"WIN");}}


MiYu 2010-08-09 11:59 发表评论
]]>
博弈 入门 ( ACM 博弈 l合 )http://www.shnenglu.com/MiYu/archive/2010/08/09/122753.htmlMiYuMiYuMon, 09 Aug 2010 03:24:00 GMThttp://www.shnenglu.com/MiYu/archive/2010/08/09/122753.htmlhttp://www.shnenglu.com/MiYu/comments/122753.htmlhttp://www.shnenglu.com/MiYu/archive/2010/08/09/122753.html#Feedback1http://www.shnenglu.com/MiYu/comments/commentRss/122753.htmlhttp://www.shnenglu.com/MiYu/services/trackbacks/122753.htmlMiYu原创, 转帖h?: 转蝲?______________白白の屋

Lq状态(也称必|态,
奇异局势)Q(满QQ意非q态经q一ơ操作可以变为^衡态)

()巴什博奕(Bash Game):

只有一?/span>n个物?/span>,两个从q堆物品中取?/span>,规定每次臛_取一?/span>,最多取m?/span>.最后取光者得?/span>.

n = (m+1)r+s , (rZQ意自然数,s≤m), ?/span>n%(m+1) != 0, 则先取者肯定获?/span>

(?/span>)威佐夫博?/span>(Wythoff Game):

有两堆各若干个物?/font>,两个从某一堆或同时从两堆中取同样多的物?/font>,规定每次臛_取一?/font>,多者不?/font>,最后取光者得?/font>.

(ak,bk)(ak ≤ bk ,k=0,1,2,...,n)表示奇异局?/span>

求法Q?/span>

ak =[k(1+√5)/2], bk= ak + k (k=0,1,2,...,n Ҏ可C取整函?/span>)

       判断Q?/span>

              Gold=(1+sqrt(5.0))/2.0Q?/span>

1Q假设(aQ?/span>bQؓW?/span>kU奇异局?/span>(k=0,1,2...) 那么k=b-a;

2Q判断其a==(int)(k*Gold),相等则ؓ奇异局?/span>

Q注Q采用适当的方?/span>,可以非奇异局势变为奇异局?/span>.

假设面对的局势是(a,b)

?/span> b = a,则同时从两堆中取?/span> a 个物?/span>,变Z奇异局?/span>(0,0)Q?/span>

1.       如果a = ak,

1.1   b > bk, 那么,取走b - bk个物?/span>,卛_为奇异局?/span>(ak, bk)Q?/span>

1.2   b < bk 则同时从两堆中拿?/span> ak – a[b – ak]个物?/span>,变ؓ奇异局?/span>( a[b – ak] , a[b – ak]+ b - ak)Q?/span>

2         如果a = bk ,

2.1   b > ak ,则从W二堆中拿走多余的数?/span>b – ak

2.2   b < ak ,?/span> ?/span>b = aj (j < k) 从第一堆中拿走多余的数?/span>a– bj; (a > bj)

?/span>b = bj (j < k) 从第一堆中拿走多余的数?/span>a– aj; ( a > aj)

Q?/span>

例题Q?/span>pku 1067

(?/span>)姆博奕(Nimm Game):

?/font>n堆各若干个物?/font>,两个从某一堆取L多的物品,规定每次臛_取一?/font>,多者不?/font>,最后取光者得?/font>.

M奇异局?/span>(a1, a2, … , an)都有a1(+)a2(+)…(+)an =0. ( (+)?/span> 按位^)

Nim游戏介:

Q?Q有两个玩家Q?/p>

Q?Q有三堆扑克牌(比如Q可以分别是5Q?Q?张)Q?/p>

     游戏双方轮流操作Q?/p>

Q?Q玩家的每次操作是选择其中某一堆牌Q然后从中取CQ意张Q?/p>

     最后一ơ去拍的一方ؓ莯方;
 
定义: 假设 (xm · · · x0)2 ?ym · · · y0)2 的nim-sum?zm · · · z0)2,则我们表C成 (xm · · · x0)2 ⊕ (ym · · · y0)2 = (zm · · · z0)2, 
      q里Qzk = xk + yk (mod 2)Qk=0…mQ?

     

nim游戏的定理一Q?/p>

 对于nim游戏的某个位|?x1,x2,x3),当且仅当它各部分的nim-sum{于0Ӟ即x1⊕x2⊕x3=0Q(x1Qx2Qx3做异或操作^Q,则当前位于必败点?/p>

 定理一也适用于更多堆的情况!

例题Q?/span>pku 2234

例题Q?/span>hdu 1730

例题Q?/span>pku 1740

例题Q?/span>pku 1704

例题Q?/span>pku 1082 (大量分析l论很简单?/span> 也可以根据简单的推论模拟实现?/span>)



MiYu 2010-08-09 11:24 发表评论
]]>
HDOJ HDU 1133 Buy the Ticket ACM 1133 IN HDU http://www.shnenglu.com/MiYu/archive/2010/08/08/122676.htmlMiYuMiYuSun, 08 Aug 2010 09:20:00 GMThttp://www.shnenglu.com/MiYu/archive/2010/08/08/122676.htmlhttp://www.shnenglu.com/MiYu/comments/122676.htmlhttp://www.shnenglu.com/MiYu/archive/2010/08/08/122676.html#Feedback0http://www.shnenglu.com/MiYu/comments/commentRss/122676.htmlhttp://www.shnenglu.com/MiYu/services/trackbacks/122676.htmlMiYu原创, 转帖h?: 转蝲?______________白白の屋

题目地址 :
         http://acm.hdu.edu.cn/showproblem.php?pid=1133
题目描述:
Problem Description
The 
"Harry Potter and the Goblet of Fire" will be on show in the next few days. As a crazy fan of Harry Potter, you will go to the cinema and have the first sight, won’t you?

Suppose the cinema only has one ticket
-office and the price for per-ticket is 50 dollars. The queue for buying the tickets is consisted of m + n persons (m persons each only has the 50-dollar bill and n persons each only has the 100-dollar bill).

Now the problem 
for you is to calculate the number of different ways of the queue that the buying process won't be stopped from the first person till the last person. 
Note: initially the ticket-office has no money. 

The buying process will be stopped on the occasion that the ticket
-office has no 50-dollar bill but the first person of the queue only has the 100-dollar bill.
 

Input
The input file contains several test cases. Each test 
case is made up of two integer numbers: m and n. It is terminated by m = n = 0. Otherwise, m, n <=100.
 

Output
For each test 
case, first print the test number (counting from 1in one line, then output the number of different ways in another line.
 

Sample Input
3 0
3 1
3 3
0 0
 

Sample Output
Test #
1:
6
Test #
2:
18
Test #
3:
180

卡特兰数的应用~~~  ^_^
1133 公式推导如下 :
//MiYu原创, 转帖h?: 转蝲?______________白白の屋

( C(m
+n, n) - C(m+n, m+1) ) * m! * n! 化简?nbsp;(m+n)! * (m-n+1/ (m+1)

推导q程如下 :

m个h?0Qn个h?00 

1:    所以如?nbsp;n > mQ那么排序方法数?nbsp;0 q一点很Ҏx?nbsp;

2:    现在我们假设 ?0的h?nbsp;‘0’表示Q?nbsp;?00的h?nbsp;1 表示?br>
      如果有这么一个序?nbsp;
0101101001001111

      当第K个位|出?的个数多?的个数时是一个不合法序列?br> 
      假设m
=4 n=3的一个序列是Q?/span>0110100 昄Q它不合法, 现在我们把它E微变化一下: 

      把第二个1Q这?前面的都是合法的Q后面的所有位0变成1Q?变成0 

      得?nbsp;
0111011 q个序列1的数量多?的数量, 昄不合法, 但现在的关键不是看这个序列是不是合法?nbsp;

      关键是:它和我们的不合法序列 
0110100 成一一对应的关p?nbsp;

      也就是说L一个不合法序列(m?Qn?)Q?nbsp;都可以由另外一个序?n
-1?和m+1?)得到 

      另外我们知道Q一个序列要么是合法的,要么是不合法?nbsp;

      所以,合法序列数量 
= 序列L?nbsp;- 不合法序列的总量 

      序列L可以q样计算m
+n 个位|中Q?nbsp;选择 n 个位|出来填?nbsp;1Q?nbsp;所以是 C(m+n, n) 

      不合法序列的数量是Q?nbsp;m
+n 个位|中Q?nbsp;选择 m+1 个位|出来填?nbsp;1 所以是 C(m+n, m+1

      然后每个人都是不一LQ所以需要全排列 m
! * n! 
      
     所以最后的公式?:  ( C(m+n, n) - C(m+n, m+1) ) * m! * n! 化简?nbsp;(m+n)! * (m-n+1/ (m+1)

推广:
      如果原来有p?0元的?那么不合法的序列的数量应该是:L一个不合法序列(m?Qn?)Q?br> 
      都可以由另外一个序?n
-1?和m+1+p?)得到,所以是m+n 个位|中Q?nbsp;选择 m+1+p 个位|?br>
      出来填上 
1 所以是 C(m+n, m+1+p) 接下来的化简׃推了.


代码如下 :
//MiYu原创, 转帖h?: 转蝲?______________白白の屋

#include 
<iostream>
#include 
<string>
using namespace std;
#define MAX 100
#define BASE 10000
void multiply(int a[],int Max,int b)  //大数乘小?/span>
{
    
int i,array=0;
    
for (i=Max-1; i>=0; i--)   
    {
        array
+=b*a[i];
        a[i] 
= array%BASE;
        array 
/= BASE;   
    }
}
 
void divide(int a[], int Max, int b)  //大数除小?/span>
{
    
int i,div=0;
    
for (i=0;i<Max; i++)   
    {
        div 
= div*BASE + a[i];
        a[i] 
= div / b;
        div 
%= b;
    }
}
int fact[205][MAX];
void setFact ()
{
     fact[
0][MAX-1= fact[1][MAX-1= 1;
     
for ( int i = 2; i <= 200++ i )
     {
           memcpy ( fact[i] , fact[i
-1] , MAX * sizeof ( int ) );
           multiply ( fact[i] , MAX , i ); 
     } 
}
void outPut ( int ctl[MAX] )
{
     
int i = 0;
     
while ( i < MAX && ctl[i] == 0 )
     {
             i 
++ ; //d? 
     }
     printf ( 
"%d", ctl[i++] );             
     
while ( i < MAX )   
     {
             printf ( 
"%04d", ctl[i++] );   
     } 
     putchar ( 
'\n' ); 
}
int res[MAX];
int main ()
{
     
int M,N;
     
int ca = 1;
     setFact();
     
while ( cin >> M >> N , M + N )
     {
             printf ( 
"Test #%d:\n",ca++ );
             
if ( N > M )
             {
                  puts ( 
"0" );
                  
continue
             }
             memcpy ( res , fact[M
+N] , MAX * sizeof ( int ) );      阶乘 ( m + n )!
             multiply ( res, MAX, M 
- N + 1 );                               ( m + n )! * ( m-n+1 )
             divide ( res, MAX, M 
+ 1 );                                        ( m + n )! * ( m-n+1 )  / ( m+ 1 )         
             outPut ( res );
     }
     
return 0;
}


MiYu 2010-08-08 17:20 发表评论
]]>
HDOJ HDU 1023 1130 1133 1134 2067 ACM 1023 1130 1133 1134 2067 IN HDU ( 卡特兰数 专题 catalan )http://www.shnenglu.com/MiYu/archive/2010/08/08/122674.htmlMiYuMiYuSun, 08 Aug 2010 09:08:00 GMThttp://www.shnenglu.com/MiYu/archive/2010/08/08/122674.htmlhttp://www.shnenglu.com/MiYu/comments/122674.htmlhttp://www.shnenglu.com/MiYu/archive/2010/08/08/122674.html#Feedback1http://www.shnenglu.com/MiYu/comments/commentRss/122674.htmlhttp://www.shnenglu.com/MiYu/services/trackbacks/122674.html______________白白の屋

                 卡特兰数专题

更多卡特兰数资料 L  卡特兰数
 
HDU 1023 1130  1134  2067 都是标准的卡特兰? 具体说明误
卡特兰数  ,只是有一炚w要注? ?5?/span>下的catalan?br>
可以
直接使用 long long ?__int64 提交? 但是?N 过35 之后, q就需?span style="COLOR: red">大数? 

下面?2067 ?long long 代码 ,详细误  (  
2067 兔的棋?解题报告 ) 没有使用递归?, 直接用的catalan ?q代? :

//MiYu原创, 转帖h?: 转蝲?______________白白の屋

#include
<iostream>
using namespace std;
typedef 
long long int64;
int64 f[
37][37];
int main()
{
    
int ca=0;
    
int N;
    
while ( cin >> N , N + 1 )
    {
        
++ ca;
        
for ( int i = 1;i <= N; ++ i )
        {
              f[
0][i] = 1;
        }
        
for ( int i = 1; i < N; ++ i )
        {
              
for ( int j = i; j <= N; ++ j )
              {
                    
if ( i == j )
                    {
                         f[i][j] 
= f[i-1][j];
                    }
                    
else
                    {
                         f[i][j] 
= f[i-1][j] + f[i][j-1];
                    }
              }
        }
        printf(
"%d %d %I64d\n", ca, N, 2 * f[N-1][N] );
    }
    
return 0;
}



除了 2067 ? 其他的题目均是大数的cd, 在这? 各位 ACMer , 请出你们的大数模板吧 .

或者某些代码牛人可以自己手?nbsp;<-------0rz

写好代码?只需按题目要求格式做相应的改? 便能直接AC.  1133 E微有点不同. 会在

最后给出它的解题报?

1023  1130 1134 直接使用 catalan?的递归?,代码如下, 使用的是高精度乘? ( 需要在输入l束控制斚wҎ各题做相应变?) :


//MiYu原创, 转帖h?: 转蝲?______________白白の屋

#include
<iostream>
using namespace std;
#define MAX 105
#define BASE 10000
typedef 
int myType[MAX+10];
void multiply ( int a[], int Max, int b )  //大数乘小?/span>
{
    
int i,array=0;
    
for (i=Max-1; i>=0; i--)   
    {
        array
+=b*a[i];
        a[i] 
= array%BASE;
        array 
/= BASE;   
    }
}
 
void divide ( int a[], int Max, int b )  //大数除小?/span>
{
    
int i,div=0;
    
for (i=0;i<Max; i++)   
    {
        div 
= div*BASE + a[i];
        a[i] 
= div / b;
        div 
%= b;
    }
}
void outPut ( myType ctl[MAX] ,int N )
{
     
int i = 0;
     
while ( i < MAX && ctl[N][i] == 0 )
     {
             i 
++ ; //d? 
     }
     cout 
<< ctl[N][i++];             
     
while ( i < MAX )   
     {
             printf ( 
"%04d", ctl[N][i++] );   
     } 
     cout 
<< endl; 
}
void setNum ( myType ctl[MAX] )
{
     memset ( ctl[
1], 0, MAX * sizeof ( int ) );
     ctl[
1][MAX-1= 1;
     
for ( int i = 2; i < 101; i ++ )
     {
         memcpy ( ctl[i], ctl[i
-1], MAX * sizeof ( int ) );      
         multiply ( ctl[i], MAX, 
4 * i - 2 );               
         divide ( ctl[i], MAX, i 
+ 1 );                  
     } 
}
myType ctl[MAX]; 
int main()
{
    setNum ( ctl );
    
int N; 
    
while ( cin >> N )     // q里Ҏ各题要求需要做相应变化
    {
           outPut ( ctl, N ); 
    }
    
return 0;
}



1133 公式推导如下 :
//MiYu原创, 转帖h?: 转蝲?______________白白の屋

( C(m
+n, n) - C(m+n, m+1) ) * m! * n! 化简?nbsp;(m+n)! * (m-n+1/ (m+1)

推导q程如下 :

m个h?0Qn个h?00 

1:    所以如?nbsp;n > mQ那么排序方法数?nbsp;0 q一点很Ҏx?nbsp;

2:    现在我们假设 ?0的h?nbsp;‘0’表示Q?nbsp;?00的h?nbsp;1 表示?br>
      如果有这么一个序?nbsp;
0101101001001111

      当第K个位|出?的个数多?的个数时是一个不合法序列?br> 
      假设m
=4 n=3的一个序列是Q?/span>0110100 昄Q它不合法, 现在我们把它E微变化一下: 

      把第二个1Q这?前面的都是合法的Q后面的所有位0变成1Q?变成0 

      得?nbsp;
0111011 q个序列1的数量多?的数量, 昄不合法, 但现在的关键不是看这个序列是不是合法?nbsp;

      关键是:它和我们的不合法序列 
0110100 成一一对应的关p?nbsp;

      也就是说L一个不合法序列(m?Qn?)Q?nbsp;都可以由另外一个序?n
-1?和m+1?)得到 

      另外我们知道Q一个序列要么是合法的,要么是不合法?nbsp;

      所以,合法序列数量 
= 序列L?nbsp;- 不合法序列的总量 

      序列L可以q样计算m
+n 个位|中Q?nbsp;选择 n 个位|出来填?nbsp;1Q?nbsp;所以是 C(m+n, n) 

      不合法序列的数量是Q?nbsp;m
+n 个位|中Q?nbsp;选择 m+1 个位|出来填?nbsp;1 所以是 C(m+n, m+1

      然后每个人都是不一LQ所以需要全排列 m
! * n! 
      
     所以最后的公式?:  ( C(m+n, n) - C(m+n, m+1) ) * m! * n! 化简?nbsp;(m+n)! * (m-n+1/ (m+1)

推广:
      如果原来有p?0元的?那么不合法的序列的数量应该是:L一个不合法序列(m?Qn?)Q?br> 
      都可以由另外一个序?n
-1?和m+1+p?)得到,所以是m+n 个位|中Q?nbsp;选择 m+1+p 个位|?br>
      出来填上 
1 所以是 C(m+n, m+1+p) 接下来的化简׃推了.


代码如下 :
//MiYu原创, 转帖h?: 转蝲?______________白白の屋

#include 
<iostream>
#include 
<string>
using namespace std;
#define MAX 100
#define BASE 10000
void multiply(int a[],int Max,int b)  //大数乘小?/span>
{
    
int i,array=0;
    
for (i=Max-1; i>=0; i--)   
    {
        array
+=b*a[i];
        a[i] 
= array%BASE;
        array 
/= BASE;   
    }
}
 
void divide(int a[], int Max, int b)  //大数除小?/span>
{
    
int i,div=0;
    
for (i=0;i<Max; i++)   
    {
        div 
= div*BASE + a[i];
        a[i] 
= div / b;
        div 
%= b;
    }
}
int fact[205][MAX];
void setFact ()
{
     fact[
0][MAX-1= fact[1][MAX-1= 1;
     
for ( int i = 2; i <= 200++ i )
     {
           memcpy ( fact[i] , fact[i
-1] , MAX * sizeof ( int ) );
           multiply ( fact[i] , MAX , i ); 
     } 
}
void outPut ( int ctl[MAX] )
{
     
int i = 0;
     
while ( i < MAX && ctl[i] == 0 )
     {
             i 
++ ; //d? 
     }
     printf ( 
"%d", ctl[i++] );             
     
while ( i < MAX )   
     {
             printf ( 
"%04d", ctl[i++] );   
     } 
     putchar ( 
'\n' ); 
}
int res[MAX];
int main ()
{
     
int M,N;
     
int ca = 1;
     setFact();
     
while ( cin >> M >> N , M + N )
     {
             printf ( 
"Test #%d:\n",ca++ );
             
if ( N > M )
             {
                  puts ( 
"0" );
                  
continue
             }
             memcpy ( res , fact[M
+N] , MAX * sizeof ( int ) );      //阶乘 ( m + n )!
             multiply ( res, MAX, M 
- N + 1 );                               //( m + n )! * ( m-n+1 )
             divide ( res, MAX, M 
+ 1 );                                        //( m + n )! * ( m-n+1 )  / ( m+ 1 )         
             outPut ( res );
     }
     
return 0;
}



MiYu 2010-08-08 17:08 发表评论
]]>
错排公式 ( ACM 数论 l合 )http://www.shnenglu.com/MiYu/archive/2010/08/08/122615.htmlMiYuMiYuSun, 08 Aug 2010 00:58:00 GMThttp://www.shnenglu.com/MiYu/archive/2010/08/08/122615.htmlhttp://www.shnenglu.com/MiYu/comments/122615.htmlhttp://www.shnenglu.com/MiYu/archive/2010/08/08/122615.html#Feedback0http://www.shnenglu.com/MiYu/comments/commentRss/122615.htmlhttp://www.shnenglu.com/MiYu/services/trackbacks/122615.html 

MiYu原创, 转帖h?: 转蝲?______________白白の屋

错排公式:

错排公式

目录
错排公式的由?br>递推的方法推导错排公?br>Ҏ原理
化公?br> 

错排公式的由?br>
  pala提出的问? 十本不同的书攑֜书架上。现重新摆放Q每本书都不在原来攄位置。有几种摆法Q?br>  q个问题推广一下,是错排问题: n个有序的元素应有nQ种不同的排列。如若一个排列式的所有的元素都不在原来的位置上,则称q个排列为错排?br>递推的方法推导错排公?br>
  当n个编号元素放在n个编号位|?元素~号与位|编号各不对应的Ҏ数用M(n)表示,那么M(n
-1)pCn-1个编号元素放在n-1个编号位|?各不对应的方法数,其它cL.
  W一?把第n个元素放在一个位|?比如位置k,一共有n
-1U方?
  W二?攄号ؓk的元?q时有两U情?
1,把它攑ֈ位置n,那么,对于剩下的n-2个元?有M(n-2)U方?2,不把它放C|n,q时,对于qn-1个元?有M(n-1)U方?
  lg得到
  M(n)
=(n-1)[M(n-2)+M(n-1)]
  Ҏ圎ͼM(
1)=0,M(2)=1
  下面通过q个递推关系推导通项公式:
  为方便v见,设M(k)
=k!N(k), (k=1,2,…,n)
  则N(
1)=0,N(2)=1/2
  n
>=3?n!N(n)=(n-1)(n-1)!N(n-1)+(n-1)!N(n-2)
  ?nbsp;nN(n)
=(n-1)N(n-1)+N(n-2)
  于是有N(n)
-N(n-1)=-[N(n-1)-N(n-2)]/n=(-1/n)[-1/(n-1)][-1/(n-2)]…(-1/3)[N(2)-N(1)]=(-1)^n/n!
  因此
  N(n
-1)-N(n-2)=(-1)^(n-1)/(n-1)!
  N(
2)-N(1)=(-1)^2/2!
  相加Q可?br>  N(n)
=(-1)^2/2!++(-1)^(n-1)/(n-1)!+(-1)^n/n!
  因此
  M(n)
=n![(-1)^2/2!++(-1)^(n-1)/(n-1)!+(-1)^n/n!]
  可以得到
  错排公式为M(n)
=n!(1/2!-1/3!+…..+(-1)^n/n!)
Ҏ原理

  正整??/span>2?/span>3?#8230;…、n的全排列有n!U,其中Wk位是k的排列有Qn-1)!Q当k??/span>2?/span>3?#8230;…、nӞ共有n*Qn-1)!U排列,׃是错排,q些排列应排除,但是此时把同时有两个C错排的排列多排除了一ơ,应补上;在补上时Q把同时有三个数不错排的排列多补上了一ơ,应排除;……Ql这一q程Q得到错排的排列U数?br>  M(n)=n!-n!/1!+n!/2!-n!/3!++(-1)^n*n!/n!=sigma(k=2~n) (-1)^k*n!/k!
  即M(n)
=n![1/0!-1/1!+1/2!-1/3!+1/4!+..+(-1)^n/n!]
  ?sigma表示q加W号,(k
=2~n)是连加的范围
化公?br>
  另外Q书上的错排公式为Dn
=n!(1/0!-1/1!+1/2!-1/3!-..+(-1)^n/n!),此公式算n很大时就很不方便Q后来发现它可以化简为1个优的式子Dn=[n!/e+0.5],[x]为取整函敎ͼ
  公式证明较简单.观察一般书上的公式Q可以发现e
-1的前与之相同,然后作比较可?/span>/Dn-n!e-1/<1/(n+1)<0.5,于是得到这个简单而优的公式Q此仅供参考)


MiYu 2010-08-08 08:58 发表评论
]]>
卡特兰数 Catalan?( ACM 数论 l合 )http://www.shnenglu.com/MiYu/archive/2010/08/07/122573.htmlMiYuMiYuSat, 07 Aug 2010 13:51:00 GMThttp://www.shnenglu.com/MiYu/archive/2010/08/07/122573.htmlhttp://www.shnenglu.com/MiYu/comments/122573.htmlhttp://www.shnenglu.com/MiYu/archive/2010/08/07/122573.html#Feedback0http://www.shnenglu.com/MiYu/comments/commentRss/122573.htmlhttp://www.shnenglu.com/MiYu/services/trackbacks/122573.html

l基癄资料:

 

卡塔兰数

卡塔兰数?a style="BACKGROUND-IMAGE: none; COLOR: rgb(6,69,173); TEXT-DECORATION: none; background-origin: initial; background-clip: initial" class="mw-redirect" title="l合数学" href="http://www.shnenglu.com/zh-cn/%E7%B5%84%E5%90%88%E6%95%B8%E5%AD%B8">l合数学中一个常出现在各U计数问题中出现?a style="BACKGROUND-IMAGE: none; COLOR: rgb(6,69,173); TEXT-DECORATION: none; background-origin: initial; background-clip: initial" title="数列" href="http://www.shnenglu.com/zh-cn/%E6%95%B0%E5%88%97">数列。由?a style="BACKGROUND-IMAGE: none; COLOR: rgb(6,69,173); TEXT-DECORATION: none; background-origin: initial; background-clip: initial" class="mw-redirect" title="比利? href="http://www.shnenglu.com/zh-cn/%E6%AF%94%E5%88%A9%E6%99%82">比利?/a>的数学家Ƨ仁·查理·卡塔?/a> (18141894)命名?/p>

卡塔兰数的一般项公式?span class="Apple-converted-space"> C_n = \frac{1}{n+1}{2n \choose n} = \frac{(2n)!}{(n+1)!n!}                      另类递归式:  h(n)=((4*n-2)/(n+1))*h(n-1);

前几ؓ Q?a style="BACKGROUND-IMAGE: none; COLOR: rgb(6,69,173); TEXT-DECORATION: none; background-origin: initial; background-clip: initial" title="整数数列U上大全" href="http://www.shnenglu.com/zh-cn/%E6%95%B4%E6%95%B8%E6%95%B8%E5%88%97%E7%B7%9A%E4%B8%8A%E5%A4%A7%E5%85%A8">OEIS中的数列A000108Q? 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, ...

[~辑]性质

Cn的另一个表辑Ş式ؓC_n = {2n\choose n} - {2n\choose n-1} \quad\mbox{ for }n\ge 1 所以,Cn是一?a style="BACKGROUND-IMAGE: none; COLOR: rgb(6,69,173); TEXT-DECORATION: none; background-origin: initial; background-clip: initial" title="自然? href="http://www.shnenglu.com/zh-cn/%E8%87%AA%E7%84%B6%E6%95%B0">自然?/a>Q这一点在先前的通项公式中ƈ不显而易见。这个表辑Ş式也是André对前一公式证明的基?见下文的W二个证?/a>?

卡塔兰数满以下递推关系

C_0 = 1 \quad \mbox{and} \quad C_{n+1}=\sum_{i=0}^{n}C_i\,C_{n-i}\quad\mbox{for }n\ge 0.

它也满

C_0 = 1 \quad \mbox{and} \quad C_{n+1}=\frac{2(2n+1)}{n+2}C_n,

q提供了一个更快速的Ҏ来计卡塔兰数?/p>

卡塔兰数的渐q增长ؓ

C_n \sim \frac{4^n}{n^{3/2}\sqrt{\pi}}

它的含义是左式除以右式的?a style="BACKGROUND-IMAGE: none; COLOR: rgb(6,69,173); TEXT-DECORATION: none; background-origin: initial; background-clip: initial" title="极限" href="http://www.shnenglu.com/zh-cn/%E6%9E%81%E9%99%90">向?/a>1?em>n → ∞。(q可以用n!?a style="BACKGROUND-IMAGE: none; COLOR: rgb(6,69,173); TEXT-DECORATION: none; background-origin: initial; background-clip: initial" title="斯特灵公? href="http://www.shnenglu.com/zh-cn/%E6%96%AF%E7%89%B9%E9%9D%88%E5%85%AC%E5%BC%8F">斯特灵公?/a>来证明。)

所有的奇卡塔兰?em>Cn都满?span style="FONT-FAMILY: serif" class="texhtml">n = 2k − 1。所有其他的卡塔兰数都是偶数?/p>

[~辑]应用

l合数学中有非常?的组合结构可以用卡塔兰数来计数。在Richard P. Stanley的Enumerative Combinatorics: Volume 2一书的习题中包括了66个相异的可由卡塔兰数表达的组合结构。以下用Cn=3?em>Cn=4举若q例Q?/p>

  • Cn表示长度2n的dyck word的个数。Dyck word是一个有n个X?em>n个Yl成的字Ԍ且所有的部分字串皆满X的个数大于等于Y的个数。以下ؓ长度?的dyck words:
XXXYYY XYXXYY XYXYXY XXYYXY XXYXYY
  • 上例的X换成左括PY换成xPCn表示所有包?em>nl括L合法q算式的个数:
((())) ()(()) ()()() (())() (()())

                                                                      

  • Cn表示所有不同构的含n个分枝结点的?a style="BACKGROUND-IMAGE: none; COLOR: rgb(6,69,173); TEXT-DECORATION: none; background-origin: initial; background-clip: initial" title="二叉? href="http://www.shnenglu.com/zh-cn/%E4%BA%8C%E5%8F%89%E6%A0%91">二叉?/a>的个数。(一个有根二叉树是满的当且仅当每个结炚w有两个子树或没有子树。)

证明Q?/em>

?表示q栈Q?表示出栈Q则可{化ؓ求一?em>2n位、含n??em>n?的二q制敎ͼ满从左往x描到L一位时Q经q的0C多于1数。显然含n??em>n??em>2n位二q制数共?img style="BORDER-BOTTOM-STYLE: none; BORDER-RIGHT-STYLE: none; MARGIN: 0px; BORDER-TOP-STYLE: none; VERTICAL-ALIGN: middle; BORDER-LEFT-STYLE: none" class="tex" alt="{2n \choose n}" src="http://upload.wikimedia.org/math/c/9/2/c92da943df73dc077dbee5514376346a.png">个,下面考虑不满求的数目.

考虑一个含n??em>n??n位二q制敎ͼ扫描到第2m+1位上时有m+1??em>m?Q容易证明一定存在这L情况Q,则后面的0-1排列中必?em>n-m??em>n-m-1?。将2m+2及其以后的部?变成1?变成0Q则对应一?em>n+1??em>n-1?的二q制数。反之亦Ӟ怼的思\证明两者一一对应Q?/p>

从?img style="BORDER-BOTTOM-STYLE: none; BORDER-RIGHT-STYLE: none; MARGIN: 0px; BORDER-TOP-STYLE: none; VERTICAL-ALIGN: middle; BORDER-LEFT-STYLE: none" class="tex" alt="C_n = {2n \choose n} - {2n \choose n + 1} = \frac{1}{n+1}{2n \choose n}" src="http://upload.wikimedia.org/math/4/8/2/4828faf1c29e4b699529f2275cc63453.png">。证毕?/p>

  • Cn表示所有在n × n格点中不过对角U的单调路径的个数。一个单调\径从格点左下角出发,在格点右上角l束Q每一步均为向上或向右。计这U\径的个数{h于计Dyck word的个敎ͼ X代表“向右”QY代表“向上”。下图ؓn = 4的情况:
  •                                                                        

                                                                                

  • Cn表示集合{1, ..., n}?a style="BACKGROUND-IMAGE: none; COLOR: rgb(204,34,0); TEXT-DECORATION: none; background-origin: initial; background-clip: initial" class="new" title="不交叉划分(未撰写Q? href="http://www.shnenglu.com/w/index.php?title=%E4%B8%8D%E4%BA%A4%E5%8F%89%E5%88%92%E5%88%86&action=edit&redlink=1">不交叉划?/a>的个? 那么, Cn 永远不大于第n?a style="BACKGROUND-IMAGE: none; COLOR: rgb(6,69,173); TEXT-DECORATION: none; background-origin: initial; background-clip: initial" title="贝尔? href="http://www.shnenglu.com/zh-cn/%E8%B4%9D%E5%B0%94%E6%95%B0">贝尔?/a>. Cn也表C集合{1, ..., 2n}?a style="BACKGROUND-IMAGE: none; COLOR: rgb(204,34,0); TEXT-DECORATION: none; background-origin: initial; background-clip: initial" class="new" title="不交叉划分(未撰写Q? href="http://www.shnenglu.com/w/index.php?title=%E4%B8%8D%E4%BA%A4%E5%8F%89%E5%88%92%E5%88%86&action=edit&redlink=1">不交叉划?/a>的个敎ͼ其中每个D落的长度ؓ2。综合这两个l论Q可以用数学归纳?/a>证明 that all of the free cumulants of degree more than 2 of the Wigner semicircle law are zero. This law is important in free probability theory and the theory of random matrices.
  • Cn表示?em>n个长方Ş填充一个高度ؓn的阶梯状囑Ş的方法个数。下图ؓ n = 4的情?

                                                                                          



癑ֺ癄资料:
?br>
  中文:卡特兰数
  Catalan数是l合数学中一个常出现在各U计数问题中出现的数列。由以比利时的数学家Ƨ仁·查理·卡塔?nbsp;(
18141894)命名?br>  原理Q?br>  令h(0)=1,h(1)Q?/span>1,catalan数满递归式:
  h(n)
= h(0)*h(n-1+ h(1)*h(n-2+  + h(n-1)h(0) (其中n>=2)
  该递推关系的解为:
  h(n)
=C(2n,n)/(n + 1) (n=1,2,3,)
       另类递归式:  h(n)=((4*n-2)/(n+1))*h(n-1);
  
  前几ؓ QOEIS中的数列A000108Q? 
11251442132429143048621679658786208012742900267444096948453535767012964479047763870017672631906564120420244662670209148256364034305961365012899041473244861946401452
应用

  我ȝ了一下,最典型的四cd用:Q实质上却都一P无非是递归{式的应用,q你能不能分解问题写出递归式了Q?br>
1.括号化问题?br>
  矩阵链乘Q?nbsp;P
=a1×a2×a3×……×anQ依据乘法结合律Q不改变光序,只用括号表示成对的乘U,试问有几U括号化的方案?(h(n)U?
2.出栈ơ序问题?br>
  一个栈(无穷?的进栈序列ؓ1,
2,3,..n,有多个不同的出栈序?/span>?
  cMQ?br>  (
1)?n个h排成一行进入剧场。入5元。其中只有n个h有一?元钞,另外n人只?0元钞,剧院无其它钞,问有多少中方法得只要有10元的Z,售票处就?元的钞票NQ?持5元者到达视作将5元入栈,?0元者到达视作栈中?元出?
  (
2)在圆上选择2n个点,这些点成对q接hQ得所得到的n条线D不怺的方法数?br>3.多边行划分Z角Ş问题?br>
  一个凸多边形区域分成三角Ş区域的方法数
?
  cMQ一位大城市的律师在她住所以北n个街区和以东n个街区处工作。每天她?n个街区去上班。如果她
  从不I越Q但可以到Q从家到办公室的对角U,那么有多条可能的道路?
  cMQ在圆上选择2n个点,这些点成对q接h使得所得到的n条线D不怺的方法数
?
4.l顶节点l成二叉树的问题?br>
  l定N个节点,能构成多种形状不同的二叉树Q?br>  (一定是二叉?/span>!
  先去一个点作ؓ点,然后左边依次可以?至N
-1个相对应?双是N-1??两两配对怹,是h(0)*h(n-1+ h(2)*h(n-2+  + h(n-1)h(0)=h(n))
  Q能构成hQNQ个Q?/span>

MiYu 2010-08-07 21:51 发表评论
]]>
HDOJ HDU 2067 兔的棋?ACM 2067 IN HDU http://www.shnenglu.com/MiYu/archive/2010/08/07/122569.htmlMiYuMiYuSat, 07 Aug 2010 13:37:00 GMThttp://www.shnenglu.com/MiYu/archive/2010/08/07/122569.htmlhttp://www.shnenglu.com/MiYu/comments/122569.htmlhttp://www.shnenglu.com/MiYu/archive/2010/08/07/122569.html#Feedback0http://www.shnenglu.com/MiYu/comments/commentRss/122569.htmlhttp://www.shnenglu.com/MiYu/services/trackbacks/122569.htmlMiYu原创, 转帖h?: 转蝲?______________白白の屋

题目地址:
         http://acm.hdu.edu.cn/showproblem.php?pid=2067
题目描述:
Problem Description
兔的叔叔从外面旅游回来l她带来了一个礼物,兔高兴地跑回自q戉KQ拆开一看是一个棋盘,兔有所失望。不q没q几天发C盘的好玩之处。从L(
0Q?/span>0)走到l点(n,n)的最短\径数是C(2n,n),现在兔又想如果不穿对角线(但可接触对角U上的格?Q这L路径数有多少?兔想了很长旉都没惛_来,现在惌你帮助小兔解册个问题,对于你来说应该不隑֐!
 

Input
每次输入一个数n(
1<=n<=35)Q当n{于Q?时结束输入?br> 

Output
对于每个输入数据输出路径敎ͼ具体格式看Sample?br> 

Sample Input
1
3
12
-1
 

Sample Output
1 1 2
2 3 10
3 12 416024

题目分析:
假设兔的棋盘是 8 × 8 ?( 当然你也可以假设是其?)。如下图:
头方向表示从该格子下一步能ȝ格子。因Z能穿对角线Q所有对角线上的格子只有q去的箭_没有出来的箭头?br>

观察上图你就可以发现Q其实这是一张关于对角线对称的图。所有我们只要求一个方向的|然后乘以2卛_?br>我们拿下三角来考虑。不隑֏玎ͼ所有在0列上的格子,路径数都?1 (只能从上面过??br>而其他格子则都是׃、左两个方向q来Q即:f(i, j) = f(i - 1, j) + f(i, j - 1);
另外f(i, i) = f(i, j - 1)  或?f(i, i) = f( i-1, j ) ;

代码如下:
MiYu原创, 转帖h?: 转蝲?______________白白の屋

#include
<iostream>
using namespace std;
typedef 
long long int64;
int64 f[
37][37];
int main()
{
    
int ca=0;
    
int N;
    
while ( cin >> N , N + 1 )
    {
        
++ ca;
        
for ( int i = 1;i <= N; ++ i )
        {
              f[
0][i] = 1;
        }
        
for ( int i = 1; i < N; ++ i )
        {
              
for ( int j = i; j <= N; ++ j )
              {
                    
if ( i == j )
                    {
                         f[i][j] 
= f[i-1][j];
                    }
                    
else
                    {
                         f[i][j] 
= f[i-1][j] + f[i][j-1];
                    }
              }
        }
        printf(
"%d %d %I64d\n", ca, N, 2 * f[N-1][N] );
    }
    
return 0;
}

另外看别人的解题报告说这个是卡特兰数 ( 详细h?nbsp;<<卡特兰数>>  ), 其实现在q不理解, 分析如下:
Catalan数。?br>令h(1)Q?/span>1,h(0)=1Qcatalan数满递归式:
  h(n)
= h(0)*h(n-1)+h(1)*h(n-2+  + h(n-1)h(0) (其中n>=2)
  另类递归式:
  h(n)
=((4*n-2)/(n+1))*h(n-1);
  该递推关系的解为:
  h(n)
=C(2n,n)/(n+1) (n=1,2,3,…)

附卡特兰代码:
#include<stdio.h>
int main()
{
    __int64 a[
37][37]={0};
    
int i,j,n,t=0;
    a[
0][0]=0;
    a[
0][1]=1;
    a[
1][1]=2;
    
for(i=2;i<37;i++)
    {
        a[i][
0]=1;
        
for(j=1;j<i-1;j++)
            a[i][j]
=a[i][j-1]+a[i-1][j];
        a[i][i
-1]=a[i][i-2]+a[i-1][i-1]/2;
        a[i][i]
=2*a[i][i-2]+a[i-1][i-1];
 
    }
    
while(scanf("%d",&n)&&n!=-1)
    {
        printf(
"%d %d %I64d\n",++t,n,a[n][n]);
    }
    
return 0;
}


MiYu 2010-08-07 21:37 发表评论
]]>
HDOJ HDU 2068 RPG的错?ACM 2068 IN HDU http://www.shnenglu.com/MiYu/archive/2010/08/06/122456.htmlMiYuMiYuFri, 06 Aug 2010 08:00:00 GMThttp://www.shnenglu.com/MiYu/archive/2010/08/06/122456.htmlhttp://www.shnenglu.com/MiYu/comments/122456.htmlhttp://www.shnenglu.com/MiYu/archive/2010/08/06/122456.html#Feedback0http://www.shnenglu.com/MiYu/comments/commentRss/122456.htmlhttp://www.shnenglu.com/MiYu/services/trackbacks/122456.htmlMiYu原创, 转帖h?: 转蝲?______________白白の屋

题目地址:
         http://acm.hdu.edu.cn/showproblem.php?pid=2068
题目描述:
Problem Description
今年暑假杭电ACM集训队第一ơ组成女生队,其中有一队叫RPG,但做为集训队成员之一的野骆驼竟然不知道RPG三个人具体是谁谁。RPGl他Z让他猜猜Q第一ơ猜QR是公主,P是草儿,G是月野兔Q第二次猜:R是草儿,P是月野兔QG是公主;W三ơ猜QR是草儿,P是公主,G是月野兔Q?img src="http://www.shnenglu.com/Images/dot.gif">可怜的野骆驼第六次l于把RPG分清楚了。由于RPG的带动,做ACM的女生越来越多,我们的野骆驼想都知道她们Q可现在有N多hQ他要猜的次数可多了,Z不ؓN骆驼Q女生们只要求他{对一半或以上qq关Q请问有多少l答案能使他利q关?br> 

Input
输入的数据里有多个case,每个case包括一个nQ代表有几个女生Q(n
<=25Q? n = 0输入l束?br> 

Sample Input
1
2
0
 

Sample Output
1
1

很明昄 错排 + 排列l合 的题? 更多错排资料L?--> << 错排公式 >>

要猜对一半或一半以? 那么是从给出的 n 个h?取出 于或等?n / 2 的hq行错排 ,

因ؓ题目问的是顺利通关的所有解, 所以最后需要篏?0 -> n / 2 的错排方?

错排公式
F ( n ) = ( n - 1 ) * ( F(n-1) + F ( n - 2 ) )

代码如下 :
//MiYu原创, 转帖h?: 转蝲?______________白白の屋

#include 
<stdio.h>
typedef 
long long int64;
int64 Com ( 
int n, int m )  // ?Cn m ?l合?/sup>
{
      
if ( m == 0 )
      {
           
return 1
      }
      int64 up 
= 1,down = 1;
      
for ( int i = 0; i < m; ++ i )
      {
            up 
*= n - i;
            down 
*= i + 1
      } 
      
return up / down;
}
int64 F[
14= { 0012 };
void setNum ()
{
     
for ( int i = 4; i < 14++ i )
     {
           F[i] 
= ( i - 1 ) * ( F[ i - 1 ] + F[ i - 2 ] ); 
     } 
}
int main ()
{
    
int N;
    int64 sum;
    setNum ();
    
while ( scanf("%d"&N), N )
    {
          sum 
= 1;
          
for ( int i = N / 2; i >= 0-- i )
          {
               sum 
+= Com ( N , i ) * F[i];    // 从N中取i 个h 的错排数
          }
          printf(
"%I64d\n", sum );
    }
}




MiYu 2010-08-06 16:00 发表评论
]]>
avþþþòվ| þþþþAŷAV| ɫۺϾþĻ| þþþһvr| ޾ƷĻþò| þ99Ʒþþþþ9| þ㽶߿ۿ| þþþùɫAVѹۿ| ɫþþþþۺ| ٸþĻ| ˾Ʒþ| þ߳ˮ| 뾫Ʒþþþ| þøԴƷ999| 99reֻоƷȾþ| ҹþþ| ھƷþþĻ| þ޹Ʒ| þù޸ۿ| ɫԭһþۺ| ˺ݺۺϾþ88| ҹҹݺݾþö| ŷպþþƷ| ƷƵþþþ| ٸ޾þþþþ4| պһþ | ھƷþþþav| ߾þþƷĹ | þþþþþƵ| þó˹Ʒһ| һֻƴƬ99þ| AVպAVþ| 97þþþ| ҹƷþþþþþ| ݺ޾þþþþۺ | һձȾþۺ| ŷAŷaþ| þþþŷղAV | þۺϺݺɫۺ| þþƷվ| Ʒþþþþù|