关闭

CSU 1799 小Z的黑白棋

标签: 富比尼原理
1395人阅读 评论(0) 收藏 举报
分类:

题目:

Description

小Z有一些黑白棋,他觉得黑白混杂在一起极具美感,所以他总喜欢将这些棋子排成一排序列S1,但是小Y就喜欢跟小Z作对,她会趁小Z不注意偷偷将小Z最右边的棋子拿走,往他棋子序列的最左边添加一个白色的棋子形成一个新的序列S2来破坏小Z的美感。

S2(1~n) = 白棋+S1(i=1~n-1)

小Z总相信第一感,他认为他自己最初排好的序列S1是最完美的,新的序列S2会造成一定的破坏美感指数 = damage(S1) = S1与S2有多少个位置黑色与白色互不对应

Exp:

令白棋为a,黑棋为b :S1 = ababa  S2=aabab   damage(S1)=4

因为小Z有很多种摆放序列的方式,现在他希望让你帮他求所有摆放序列的方式会造成的damage(S1)的平均值

 

Input

多组数据输入输出

每组数据输入一个整数n和m表示白棋和黑棋的数量 0<=n , m<=1000,000,000 , 保证n+m>=1

Output

每组输出一个平均值答案,用最简分数表示,如果可以化简到整数,就用整数表示

Sample Input

1 1

Sample Output

3/2

这个题目的思想大约就是富比尼原理了。

n个白棋和m个黑棋有C(m+n,n)种排列。

其中,第一个棋子为黑棋的,有C(m+n-1,n)种

第i(i=1,2,3......m+n-1)个棋子和第i+1个棋子颜色不同的,有2*C(m+n-2,n-1)种

2*C(m+n-2,n-1)*(m+n-1)=2*n*C(m+n-1,n)

所以,本题答案是(1+2*n)*C(m+n-1,n)/C(m+n,n)=(1+2*n)*m/(m+n)

代码:

#include<iostream>
#include<stdio.h>
using namespace std;
 
long long gcd(long long a,long long b)
{
    if(b==0)return a;
    return gcd(b,a%b);
}
 
int main()
{
    int m,n;
    long long a,b;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        a=n+n+1;
        a*=m;
        b=m+n;
        if(a%b==0)printf("%d\n",a/b);
        else  cout<<a/gcd(a,b)<<'/'<<b/gcd(a,b)<<endl;
    }
    return 0;
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:971728次
    • 积分:18191
    • 等级:
    • 排名:第578名
    • 原创:775篇
    • 转载:0篇
    • 译文:0篇
    • 评论:110条
    博客专栏