#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <algorithm>
using namespace std;
long long GCD (__int64 a, __int64 b) {
if (b == 0) {
return a;
}
return GCD (b, a % b);
}
int main () {
long long n;
while (scanf ("%lld", &n) == 1) {
__int64 FUCK = 1, num = 0;
for (__int64 i=1; i<=n; ++i) {
num = num * i + n * FUCK;
FUCK = FUCK * i;
__int64 gcd = GCD (FUCK, num);
FUCK = FUCK / gcd;
num = num / gcd;
//printf("%lld %lld %lld \n",num,FUCK,gcd);
}
if (num % FUCK == 0) {
printf ("%lld\n", num / FUCK);
} else {
static char strInt[1024], strNum[1024], strDon[1024];
static char strWS[1024], strLn[1024];
static char ws[] = " ";
static char ln[] = "------------------------------";
sprintf (strInt, "%lld", num / FUCK);
sprintf (strNum, "%lld", num % FUCK);
sprintf (strDon, "%lld", FUCK);
//printf("%s %s %s \n",strInt,strNum,strDon);
memset (strWS, 0, sizeof (strWS));
strncpy (strWS, ws, strlen (strInt));
memset (strLn, 0, sizeof (strLn));
strncpy (strLn, ln, std::max (strlen (strNum), strlen (strDon)));
printf ("%s %s\n%s %s\n%s %s\n", strWS, strNum, strInt, strLn, strWS, strDon);
}
}
return 0;
}
这道题思路很简单,就是一道期望题。如果要集齐所有的彩票,那么最少是n张。但是每一张的概率是n/n-i。
所以就是n/n+n/(n-1)+n/(n-2)+n/(n-3).............+n/1。每次num和FUCK就是除以最大公约数使两数互质。
难点就在于输出格式,左边输出需要买多少张,后面对于两个字符串数组比较大的长度的‘------’字符上下分别输出分子和分母。
因为题目说了没有行尾空格,所以就直接交了上去。
剩下的就是1A了!