HDU1099————Lottery HDU(86)

#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了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值