UVA10288 Coupons

来源:互联网 发布:网络用语爸爸什么意思 编辑:程序博客网 时间:2024/06/11 10:51

题意:给出一个n,求出生成所有n以内数的可能性

链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=36831

思路:概率题,求概率和,sum = n/n+n/(n-1)+n/(n-2)+.....+n/(n-n)

注意点:及时约分,否则会溢出。


以下为AC代码:

RunID
User
OJ
All
Prob ID
Result
All
Memory
(KB)
Time
(ms)
Language
All
Length
(Bytes)
Submit Time
3145577
luminous11
UVA
10288
Accepted
 15
C++11 4.8.2
2272
9 days ago
#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <vector>#include <deque>#include <list>#include <cctype>#include <algorithm>#include <climits>#include <queue>#include <stack>#include <cmath>#include <map>#include <set>#include <iomanip>#include <cstdlib>#include <ctime>#define ll long long#define ull unsigned long long#define all(x) (x).begin(), (x).end()#define clr(a, v) memset( a , v , sizeof(a) )#define pb push_back#define mp make_pair#define read(f) freopen(f, "r", stdin)#define write(f) freopen(f, "w", stdout)using namespace std;const double pi = acos(-1);struct node{    ull a;    ull b;    ull c;    int len;    int len_2;    void print(){        len = len_2 = 0;        ull tmp = c;        while ( tmp ){            len ++;            tmp /= 10;        }        tmp = a;        while ( tmp ){            len_2 ++;            tmp /= 10;        }        if ( b == 0 )            len = 0;        if ( len == 0 )            cout << a << endl;        else{            for ( int i = 0; i <= len_2; i ++ ){                cout << ' ';            }            cout << b << endl;            cout << a << ' ';            for ( int i = 0; i < len; i ++ ){                cout << '-';            }            cout << endl;            for ( int i = 0; i <= len_2; i ++ ){                cout << ' ';            }            cout << c << endl;        }    }}num[40];inline ull gcd ( ull x, ull y ){    return y == 0 ? x : gcd ( y, x % y );}void calc( ull n ){    ull a = 0, b = 0, c = 1;    num[n].a = 1;    num[n].b = 0;    num[n].c = 1;    for ( ll i = n - 1; i > 0; i -- ){        num[n].a += ( n / i );        int k = n % i;        c = gcd ( num[n].c, i );        a = num[n].c / c * k + i / c * num[n].b;        b = num[n].c / c * i;        c = gcd ( a, b );        a /= c;        b /= c;        num[n].a += a / b;        num[n].b = a % b;        num[n].c = b;    }}int main(){    ios::sync_with_stdio( false );    for ( ull i = 0; i < 35; i ++ ){        calc( i );    }    ull n;    while ( cin >> n ){        num[n].print();    }    return 0;}


0 0