HDU 5321 Beautiful Set

题目链接

我们可以枚举子集的大小k,求出所有大小为k的子集对答案的贡献,问题就解决了。

#include <bits/stdc++.h>
using namespace std;
#define prt(k) cerr<<#k" = "<<k<<endl
typedef long long ll;
typedef long long LL;
const ll inf = 0x3f3f3f3f;
const int mod = 258280327;
int exgcd(int a, int b, int &x, int &y)
{
    if (b == 0) {
        x = 1; y = 0; return a;
    } else {
        int d = exgcd(b, a%b, y, x);
        y -= a/b * x;
        return d;
    }
}
int inv(int a)
{
    int x, y, b = mod;
    exgcd(a, b, x, y);
    if (x < 0) x += mod;
    return x;
}
const int N = 102333;
int phi[N];
int fac[N], vf[N];
void init()
{
    fac[0] = 1;
    vf[0] = 1;
    for (int i=1;i<N;i++) {
        phi[i] = i;
        fac[i] = (LL) fac[i - 1] * i % mod;
        vf[i] = inv(fac[i]);
    }
    for (int i=2;i<N;i++) if (phi[i]==i) {
        for (int j=i;j < N; j+=i)
            phi[j] = phi[j] / i * (i - 1);
    }
}
int C(int n, int m)
{
    return (LL) fac[n] * vf[m] % mod * vf[n - m] % mod;
}
int cnt[N];
int n;
int id[N];
bool cmp(int a, int b)
{
    return cnt[a] > cnt[b];
}
// cnt[i] : i 的倍数有多少个
void solve()
{
    int ans1 = 0, ans2 = 0;
    for (int i=1;i<N;i++) {
        int tmp = 0;
        for (int j=1;j<N && cnt[id[j]]>=i;j++) {
            int idx = id[j];
            int t = (LL) C(cnt[idx],i) * phi[idx] % mod;
            tmp = (tmp + t) % mod;
        }
        ans2 = (ans2 + (LL) i * tmp % mod) % mod;
        tmp = (LL) tmp * fac[i] % mod * fac[n-i+1] % mod;
        ans1 = (ans1 + tmp) % mod;
    }
    if (ans1 > ans2) printf("Mr. Zstu %d\n", ans1);
    else {if (ans1 < ans2)
        printf("Mr. Hdu %d\n", ans2);
        else
            printf("Equal %d\n", ans1);
    }
}
int main()
{
    init();
    while (scanf("%d", &n)==1) {
        memset(cnt, 0 ,sizeof cnt);
        for (int i=0;i<n;i++) {
            int x; scanf("%d", &x);
            cnt[x] ++;
        }
        for (int i=1;i<N;i++) {
            id[i] = i;
            for (int j=i+i;j<N;j+=i) {
                cnt[i] += cnt[j];
            }
        }
        sort(id+1, id+N, cmp);
        solve();
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 01:47:41

HDU 5321 Beautiful Set的相关文章

HDU 5321 Beautiful Set 容斥 (看题解)

HDU 5321 感觉有点抗拒这种题目, 看到就感觉自己不会写,其实就是个沙雕题, 感觉得找个时间练练这种题. g[ i ] 表示gcd为 i 的倍数的方案数, f[ i ] 表示gcd为 i 的方案数, 然后先算g[ i ]然后直接容斥. #pragma GCC optimize(2) #pragma GCC optimize(3) #include<bits/stdc++.h> #define LL long long #define LD long double #define ull

HDU 5321 Beautiful Set 漂亮集合

题意:给定一个集合,含有n个数.浙理工先生和杭电先生各自有计算这个集合漂亮值的方法. 浙理工先生的计算方法是:对于这个n个数的某个排列,此排列的漂亮值为这个排列全部的区间最大公约数之和.然后这个集合的漂亮值为n个数的全部排列的漂亮值之和. 杭电先生的计算方法是:在这个n个数中选出k(1 ≤ k ≤ n)个数.对于某种选取方案.这样的方案的漂亮值为k个数的最大公约数乘上k.然后这个集合的漂亮值为全部选数方案的漂亮值之和. 然后他们想比比谁得到的漂亮值更大.由于数非常大,所以他们仅仅比較各自的结果对

HDU 5321 Beautiful Set 美丽集合

题意:给定一个集合,含有n个数.浙理工先生和杭电先生各自有计算这个集合美丽值的方法. 浙理工先生的计算方法是:对于这个n个数的某个排列,此排列的美丽值为这个排列所有的区间最大公约数之和.然后这个集合的美丽值为n个数的所有排列的美丽值之和. 杭电先生的计算方法是:在这个n个数中选出k(1 ≤ k ≤ n)个数,对于某种选取方案,这种方案的美丽值为k个数的最大公约数乘上k.然后这个集合的美丽值为所有选数方案的美丽值之和. 然后他们想比比谁得到的美丽值更大.因为数很大,所以他们只比较各自的结果对258

HDU Redraw Beautiful Drawings 判断最大流是否唯一解

点击打开链接 Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1660    Accepted Submission(s): 357 Problem Description Alice and Bob are playing together. Alice is crazy about

HDU 4782 Beautiful Soup(模拟)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4782 Problem Description Coach Pang has a lot of hobbies. One of them is playing with "tag soup" with the help of Beautiful Soup. Coach Pang is satisfied with Beautiful Soup in every respect, except

HDU 5179 beautiful number 离线处理

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=5179 beautiful number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 176    Accepted Submission(s): 104 Problem Description Let A=∑ni=1ai?10n?i(1≤

HDU 5062 Beautiful Palindrome Number(数学)

主题链接:http://acm.hdu.edu.cn/showproblem.php? pid=5062 Problem Description A positive integer x can represent as (a1a2-akak-a2a1)10 or (a1a2-ak?1akak?1-a2a1)10 of a 10-based notational system, we always call x is a Palindrome Number. If it satisfies 0<

HDU 5179 beautiful number (数位dp / 暴力打表 / dfs)

beautiful number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 801    Accepted Submission(s): 518 Problem Description Let A=∑ni=1ai?10n?i(1≤ai≤9)(n is the number of A's digits). We call A as "

HDU Redraw Beautiful Drawings 推断最大流是否唯一解

点击打开链接 Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1660    Accepted Submission(s): 357 Problem Description Alice and Bob are playing together. Alice is crazy about