每日一題(01.07)
阿新 • • 發佈:2019-01-13
Description:
請你程式設計求出 的值。
Input:
多行輸入,每行一個正整數k。輸入0
結束程式。
Output:
表示式的值,格式見Sample。
Sample Input:
1
3
7
0
Sample Output:
2/3
16/35
2048/6435
Reference Code
#include <iostream>
#include <vector>
using namespace std;
vector<int> fac_storage={1};
int factorial(int n){
int len=fac_storage.size();
if (len<=n){
fac_storage.push_back(fac_storage.back()*len);
return factorial(n);
}
else
return fac_storage[n];
}
int combination(int n,int m){
return factorial(n)/factorial(m)/factorial(n-m);
}
struct fraction{
int molecule;
int denominator;
};
struct fraction add(struct fraction a,struct fraction b){
struct fraction ans;
ans.molecule=a.denominator*b.molecule+a.molecule*b.denominator;
ans.denominator=a.denominator*b.denominator;
for (int i=2;i<=ans.denominator || i<=ans.molecule;i++){
while (ans.denominator%i==0 && ans.molecule%i==0){
ans.denominator/=i;
ans.molecule/=i;
}
}
return ans;
}
int sign(int n){
if (n%2==0) return 1;
else return -1;
}
struct fraction solve(int k){
struct fraction ans;
ans.denominator=1;
ans.molecule=0;
for (int i=0;i<=k;i++){
struct fraction buf;
buf.molecule=sign(i)*combination(k,i);
buf.denominator=2*i+1;
ans=add(ans,buf);
}
return ans;
}
int main(){
int k;
while (cin>>k && k){
struct fraction buf=solve(k);
cout<<buf.molecule<<"/"<<buf.denominator<<endl;
}
return 0;
}