2014 Multi-University Training Contest 1 —I Turn the pokers

本文解析了HDU 4869问题,该问题是关于计算给定操作下扑克牌最终可能的状态数量。通过分析牌翻转的特性,采用数学方法确定所有可能状态的范围,并利用组合数学中的快速幂和费马小定理来高效求解。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4869


题目大意:

有N张牌,一开始全是盖着的。M次操作,每次可以从中任意选择翻 xi 张牌。问最后的状态有多少种。


解题思路:

最终的结果一定是连续出现的,只需要求出最终的区间。

因为如果对同一张牌进行两次操作,牌的状态不改变。故牌的翻转次数一定是减少偶数次。如果所有数的和是奇数,那么最终结果也一定是奇数。同理,偶数也是一样的。所以只要递推求出最后的区间,计算sumCxim)(i=012。。。)),m是总牌数,xi是在区间内连续的奇数或偶数,在模10^9+9就是最终的答案。


代码:

const int mod = 1000000009;
using namespace std;
typedef long long ll;
long long quickpow(long long a, long long b) {
    if (b < 0) return 0;
    long long ret = 1;
    a %= mod;
    while(b) {
        if (b & 1) ret = (ret * a) % mod;
        b >>= 1;
        a = (a * a) % mod;
    }
    return ret;
}
//费马小定理求逆元(M必须是质数)
long long INV(long long a) {
    return quickpow(a, mod - 2);
}
ll fac[100010];
int main () {
    int n, m;
    int x, l, r;
    fac[0] = 1;
    for (int i = 1; i <= 100000; i++) fac[i] = (fac[i - 1] * i) % mod;
    while(scanf("%d%d", &n, &m) != EOF) {
        l = 0, r = 1;
        int nl, nr, k = 0;
        for(int i = 0; i < n; ++i) {
            scanf("%d", &x);
            nl = min(abs(l - x), abs(r - x));
            if (l <= x && x <= r) nl = 0;
            nr = max(m - abs(l + x - m), m - abs(r + x - m));
            if (l + x <= m && m <= r + x) nr = m;
            l = nl, r = nr, k = (k + x) % 2;
        }

        ll ans = 0;
        ll tmp;
        for (int i = l; i <= r; i++) if (i % 2 == k) {
            tmp = fac[m] * INV(fac[m - i] * fac[i] % mod) % mod;
            ans += tmp;
            ans %= mod;
        }
        printf("%I64d\n", ans);
    }
    return 0;
}


目前尚未有具体的官方公告或详细信息关于2025湖南大学编程竞赛(Hunan University Programming Contest)的内容[^1]。通常,这类赛事的信息会在比赛开始前几个月由主办方通过官方网站、社交媒体平台或相关技术社区进行公布。 一般而言,此类编程竞赛可能会包含以下几个方面的内容: - **比赛形式**:通常是团队赛,每队由1至3名成员组成,比赛时长约为4到5小时。 - **题目类型**:涵盖数据结构、算法设计与分析、图论、动态规划等多个领域的问题[^1]。 - **编程语言**:支持常见的编程语言如C/C++、Java、Python等[^1]。 - **评分规则**:根据解题数量以及提交次数来决定排名;对于错误提交会有相应的惩罚分。 - **参赛资格**:面向高校学生开放,有时也允许社会人士参加[^1]。 如果希望获取最新的赛事动态和详细的参赛指南,建议关注湖南大学的官方通知或联系赛事组织者以获得第一手资料。 ```python # 示例函数用于模拟检查是否有新赛事信息发布 def check_for_new_announcements(): announcements = { '2025_hunan_university_pc': { 'date': 'TBD', 'format': 'On-site/Online', 'registration_deadline': 'TBD' } } return announcements.get('2025_hunan_university_pc', None) # 检查并打印最新赛事信息 contest_details = check_for_new_announcements() if contest_details: print(f"Contest Date: {contest_details['date']}") print(f"Format: {contest_details['format']}") print(f"Registration Deadline: {contest_details['registration_deadline']}") else: print("No details available yet for 2025 Hunan University Programming Contest.") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值