中南大学2016年校队选拔赛第一场Problem A

来源:互联网 发布:滚现在是网络 编辑:程序博客网 时间:2024/04/29 11:16

Problem A: 小Z的黑白棋

Time Limit: 1 Sec  Memory Limit:128 MB
Submit: 18  Solved: 6
[Submit][Status][Ask]

Description

Z有一些黑白棋,他觉得黑白混杂在一起极具美感,所以他总喜欢将这些棋子排成一排序列S1,但是小Y就喜欢跟小Z作对,她会趁小Z不注意偷偷将小Z最右边的棋子拿走,往他棋子序列的最左边添加一个白色的棋子形成一个新的序列S2来破坏小Z的美感。
S2(1~n) = 白棋+S1(i=1~n-1)
Z总相信第一感,他认为他自己最初排好的序列S1是最完美的,新的序列S2会造成一定的破坏美感指数 = damage(S1) = S1S2有多少个位置黑色与白色互不对应
Exp:
令白棋为a,黑棋为b :S1 = ababa  S2=aabab   damage(S1)=4
 
因为小Z有很多种摆放序列的方式,现在他希望让你帮他求所有摆放序列的方式会造成的damage(S1)的平均值

Input

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

Output

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

Sample Input

1 1

Sample Output

3/2

•形成了01的字符串,每次将可组合成的某个字符串右移一位后,将最左端置

  位1,然后和原串每一位比较,得到不一样的位的个数,求的是所有的组合

  方式的平均值

•数学公式推一推就出来的说~~~
•理解为每一位不同的是多少次
•1有n个,0有m个,那么最高位的时候只有为0的才会不一样: C(n,n+m-1)
•其他位置只要跟前面一个位置不一样就可以了,那么就是说当前和前面一个

位置一个0一个1 ,共C(n-1, n+m-2),因为1,0可以交换所以要乘2

•之后所有位置都是满足的:
• 
•平均值就是(2*(n+m-1)*C(n-1,n+m-2)+C(m,n+m-1))   /   C(n,n+m)
• 
•----->(2*n*C(n,n+m-1)+C(n,n+m-1))  /   C(n,n+m)
• 
•----->(2*n+1)*C(n,n+m-1)/(C(n,n+m-1)+C(n-1,n+m-1))
• 
•----->(2*n+1)*C(n,n+m-1)/((1+n/m)*C(n,n+m-1))
• 
•----->(2*n+1)/((1+n)/m)
• 
----->(2*m*n+m)/(n+m)

#include<bits/stdc++.h>using namespace std;typedef unsigned long long ULL;ULL gcd(ULL a,ULL b){    if(b==0)        return a;    return gcd(b,a%b);}int main(){    ULL n,m;    while(cin>>n>>m)    {    ULL t1=m;    ULL t2=m+n;    ULL t3=gcd(t1,t2);    t1=t1/t3;    t2=t2/t3;    ULL t4=2*n+1;    ULL t6=gcd(t4,t2);    t4=t4/t6;    t2=t2/t6;    t1=t1*t4;    t2=t2;    t3=gcd(t1,t2);    //cout<<t1<<' '<<t2<<' '<<t3<<endl;    if(t3==t2)        cout<<t1/t2<<endl;    else        cout<<t1/t3<<"/"<<t2/t3<<endl;    }    return 0;}


0 0
原创粉丝点击