シネマ[シミュレーション]

説明 -

私はNOIP2016誰もがかなり出てきた聞いたので、多くの場合、5人の学生の地方CCF報酬K張トランスフォーマー映画のチケット報酬OIチームに映画を見に行きます。しかし、多くの場合、地方の学生N(NK)人の合計のOIチームインチ ですから、Kの人々が映画を見に行くかを決定する公正な方法を考えるウィット。
円形に配置されたN個の個体は、時計回りの順番が1番の-たびに、まだ生きている人の乱数Nを、この人は、蹴りました。あなたはKの個人の残りの部分を持ってまで続けます。
しかし、これは明らかに、あまりにも退屈なので、小さなS Niubi方法を考え出します。
円形に配置されたN個の個体は、時計回りの順番は、1番の- N、毎回ランダム1 - N数は、乱数Xが追い出されていない人々の数である場合、Xは、これが蹴られることが想定されますうち、人の(シーケンス番号の次のすなわち時計回り)そうに見える番目のX%のN + 1が生きているあなたが追い出さ、または番号(X + 1)%のN +見続けるしていない場合、彼は追い出される 1 年代をこれまでに人を追い出されるまで、誰が、その次の............時計回りかどうかを確認するために追い出され、されています。残りのKの個人まで繰り返します。
知られている小さなSの数が少ないSの方法によれば、同上である確率は映画を見る機会を得るに成功し、追い出されないことができますどのくらい彼に尋ねました。


入力-

最初の行は3つの正の整数、N、K、IDを含む(1 <= K <= N <= ^ 9.1 10 <ID = <= N)

出力-

最も簡単な分数ラインの一つは、Sは小さな確率は映画を見ることができ表します。
(確率は1または0、出力1/1または0/1の場合)


サンプル入力 -

2 1 2

サンプル出力 -

1/2
2人の合計は、スクリーニングの後、誰もが追い出された最初のラウンドの確率が等しい確率なので、答えは1/2です。


ノート -

ここに画像を挿入説明


問題解決のためのアイデア -

K / N


コード -

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n,k,ld,h;
int ye(int a,int b)
{
	return !b?a:ye(b,a%b);
}
int main()
{
	scanf("%d%d%d",&n,&k,&ld);
	if (k>=n)
	{
		printf("1/1");
		return 0;
	}
	if (k==0)
	{
		printf("0/1");
		return 0;
	}
	h=ye(n,k);
	printf("%d/%d",k/h,n/h);
	
	return 0;
} 

おすすめ

転載: blog.csdn.net/qq_43654542/article/details/90725570