#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 " , i , Cnt) ; 32 Tot += Cnt ; 33 } 34 putchar(10) ; 35 printf ("Average = %lf " , (double)Tot / T) ; 36 fclose (stdin) ; 37 fclose (stdout); 38 return 0; 39 }