集福卡活动

题目地址

#include <iostream>
#include <fstream>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <stdio.h>
#define re register
#define gc getchar()
#define int long long 
using namespace std;
const int maxn = 35 ;
int Qread () {
    int x = 0 ;
    char ch = gc ;
    while (ch > '9' || ch < '0') ch = gc ;
    while (ch >='0' && ch <= '9') {
        x = x *10 + ch - '0' ;
        ch = gc ;
    }
    return x ;
}
int n ,num = 0 ;
struct F {
    int a , b ;
};
F f[maxn] ;
int gcd(int a , int b) {
    if (!b) return a ;
    else return gcd(b , a% b) ;
}
F pls(F A , F B) {
    int lcm = A.b*(B.b/gcd(A.b , B.b) );
    F ans ;
    ans.b = lcm ;
    ans.a = A.a*(lcm/A.b)+B.a*(lcm/B.b);
    int g = gcd(ans.a ,ans.b) ;
    ans.a/=g , ans.b/= g ;
    return ans ;
}
int getd(int x){
    int ans = 0 ;
    while (x){
        ++ans ;
        x/=10 ;
    }
    return ans ;
}
signed main () {
//    freopen ("1291.in" , "r" ,stdin) ;
    n = Qread () ;
    for (re int i = 1 ; i <= n; ++ i) {
        f[i].a = n , f[i].b = i ;
        int g = gcd(n , i) ;
        f[i].a/=g , f[i].b/= g ;
    }
    F all ;

    all.a = 0 , all.b = 1 ;
    for (re int i = 1 ; i <= n; ++ i) {
        all = pls(all , f[i]) ;
        num += all.a/all.b ;
        all.a%=all.b;
        //cout <<i<<' '<<num<<' '<<all.a<<' '<<all.b<<endl;
    }
    if (all.b == 1)cout <<all.a+num<<endl;
    else {
        int L = all.a/all.b + num ;
        int ld = getd(L) ;
        int dd = getd(all.b) ;
        for(re int i = 1; i<= ld ;++ i)cout <<' ';
        cout << all.a%all.b<<endl;
        cout <<L;
        for (re int i = 1; i <= dd ;++ i) cout <<'-';
        cout <<endl;
        for (re int i = 1 ;i <= ld ; ++ i)cout <<' ';
        cout <<all.b<<endl;
    //    cout << all.a<<' '<<all.b<<endl;
    }
    fclose (stdin) ;
    fclose (stdout);
    return 0;
}
//33 31 30 37

 

集齐支付宝的五福只需要不到12次操作吗?

为了验证这一点,笔者在PC上模拟了随机产生福卡,重复一万次积攒福卡的过程。

 

这样看来,商家在福卡的数量分布上耍了小计俩。总有那么一种福卡出现的概率极小。

以下源代码:

 1 #include <cstring>
 2 #include <cstdio>
 3 #include <ctime>
 4 #include <cstdlib>
 5 #define re register
 6 #define GC getchar()
 7 int Qread () {
 8     int X = 0;
 9     char C = GC ;
10     while (C > '9' || C < '0') C = GC ;
11     while (C >='0' && C <='9') {
12         X = X * 10 + C - '0' ;
13         C = GC ;
14     }
15     return X ;
16 }
17 const int Maxn = 64 , T = 10000 ;
18 int N ;
19 unsigned long long int Ed , Tot = 0 ;
20 int main () {
21     N = Qread() ,Ed = ((unsigned long long int)1 << N) - 1;
22     srand (time(0)) ;
23     for (re int i = 1 ; i <= T ; ++ i) {
24         unsigned long long int Now = 0 ;
25         int Cnt = 0 ;
26         while (Now != Ed) {
27             int X = rand() % N ;
28             Now |= ((unsigned long long int)1 << X);
29             ++ Cnt ;
30         }
31         printf ("The %d th time takes %d\n" , i , Cnt) ;
32         Tot += Cnt ;
33     }
34     putchar(10) ;
35     printf ("Average = %lf \n" , (double)Tot / T) ;
36     fclose (stdin) ;
37     fclose (stdout);
38     return 0;
39 }

 

posted @ 2019-03-03 16:53  Betulaceae  阅读(203)  评论(0编辑  收藏  举报