HDOJ--2065

"红色病毒"问题

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5154    Accepted Submission(s): 2154


Problem Description
医学界发现的新病毒因其蔓延速度和Internet上传播的"红色病毒"不相上下,被称为"红色病毒",经研究发现,该病毒及其变种的DNA的一条单链中,胞嘧啶,腺嘧啶均是成对出现的。
现在有一长度为N的字符串,满足一下条件:
(1) 字符串仅由A,B,C,D四个字母组成;
(2) A出现偶数次(也可以不出现);
(3) C出现偶数次(也可以不出现);
计算满足条件的字符串个数.
当N=2时,所有满足条件的字符串有如下6个:BB,BD,DB,DD,AA,CC.
由于这个数据肯能非常庞大,你只要给出最后两位数字即可.
 

Input
每组输入的第一行是一个整数T,表示测试实例的个数,下面是T行数据,每行一个整数N(1<=N<2^64),当T=0时结束.
 

Output
对于每个测试实例,输出字符串个数的最后两位,每组输出后跟一个空行.
 

Sample Input
4 1 4 20 11 3 14 24 6 0
 

Sample Output
Case 1: 2 Case 2: 72 Case 3: 32 Case 4: 0 Case 1: 56 Case 2: 72 Case 3: 56
 



出的很好的一题,很考验一个人的数学能力,主要还是排列组合问题。难度为NOIP的Day1第一题难度。

算法:模拟+快速幂取模

以下是我的AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int modexp(long long a,long long b,long long n)
{
    int ret=1;
    int tmp=a;
    while(b)
    {
        if(b & 0x1)ret=ret*tmp%n;
        tmp=tmp*tmp%n;
        b>>=1; 
    }
    return ret;
}
int main()
{
    
    long long T;
    while(cin>>T && T!=0)
    {
    for(int i=1;i<=T;i++)
    {
        long long n;
        cin>>n; 
        long long final=0;
        final=modexp(4,n-1,100)+modexp(2,n-1,100);
        if(final>99)
        {
            final=final%100;
        }
        cout<<"Case "<<i<<": "<<final<<endl;
    }
    cout<<endl;
    }
    return 0;
}


<think>好的,我现在需要帮助用户查找HDOJ平台上的问题2065的解决方案或解释。首先,我得确认用户的问题具体是什么。HDOJ是杭州电子科技大学的在线评测系统,问题2065可能有特定的题目内容。不过,用户提供的引用信息里提到了NUAAOJ,也就是南京航空航天大学的OJ系统,这可能是一个混淆,我需要先确认是否正确。 用户提到参考引用[1]是关于NUAAOJ的内容,但用户的问题是关于HDOJ的。这可能意味着用户在查找不同OJ平台的信息时遇到了困难,或者引用信息可能有误。首先,我需要处理这个矛盾。可能用户误将NUAAOJ的引用放到了HDOJ的问题上,或者想同时了解两个平台的问题。但根据用户的问题,核心是HDOJ2065题,所以应该以这个为重点。 接下来,我需要查找HDOJ 2065的具体题目内容。由于无法直接访问外部资源,我需要依靠已有的知识。根据记忆,HDOJ 2065的题目通常是“红色病毒问题”,属于组合数学或递推问题,可能涉及快速幂和生成函数的应用。题目大致是给定n,求满足某种条件的字符串数量,可能涉及递推关系或模运算。 接下来,解决方案的步骤可能包括:分析题目给出的条件,建立递推公式,找到规律或矩阵快速幂的方法,或者使用生成函数来化简递推式。例如,递推式可能类似于a(n) = 2a(n-1) + 2b(n-1),然后通过特征方程或矩阵快速幂求解。 另外,用户可能需要具体的代码实现,比如使用快速幂算法来处理大数取模的情况,因为n可能非常大。例如,题目可能要求结果对某个数取模,如1000000007,这时候快速幂是必要的。 同时,用户可能需要数学上的解释,比如如何推导递推式,或者为什么使用生成函数。这部分需要详细解释,可能涉及组合数学中的排列组合,指数生成函数等概念。 然后,我需要考虑用户可能遇到的问题,比如如何处理大数的n,或者如何优化递推过程。这时矩阵快速幂或快速幂的应用是关键点,需要详细说明步骤。 最后,生成相关问题,可能涉及类似题目的解决方法,其他组合数学问题,或者不同OJ平台的使用技巧。比如如何在不同OJ上查找题目,或者其他相关题号的推荐。 现在需要确保回答符合用户的要求:结构清晰,分步骤解决,并且引用正确。但用户提供的引用[1]是关于NUAAOJ的,可能与HDOJ无关,这里可能存在错误。因此,在回答中可能需要指出这一点,并建议用户直接访问HDOJ平台查找原题,或者确认题目编号是否正确。 总结步骤: 1. 确认题目内容和正确性,建议用户核对题目来源。 2. 分析题目可能的解法,如递推、矩阵快速幂、生成函数。 3. 提供代码示例,处理大数情况下的快速幂。 4. 解释数学推导过程,帮助理解。 5. 生成相关问题,扩展用户的知识。 需要确保回答中的数学公式使用正确的LaTeX格式,行内公式用$...$,独立公式用$$...$$,并遵循其他系统级指令。</think>[用户可见层] ### HDOJ Problem 2065 分析与解答 HDOJ 2065题目常见名称为"红色病毒问题",属于组合数学与快速幂结合的典型问题。题目通常要求计算满足特定条件的字符串数量,需通过递推公式结合快速幂算法实现高效计算。 #### 题目解析 假设题目条件为:由字符$A,B,C,D$组成的字符串,要求$A,C$必须出现偶数次,求长度为$n$的字符串总数模100的结果。 递推关系可通过生成函数推导: $$ (1 + \frac{x^2}{2!} + \frac{x^4}{4!} + \cdots)^2 \cdot (1 + x + \frac{x^2}{2!} + \cdots)^2 = \left( \frac{e^x + e^{-x}}{2} \right)^2 \cdot e^{2x} $$ 化简后得到通项公式: $$ a(n) = 2^{2n-1} + 2^{n-1} $$ 最终结果需对100取模。 #### 代码实现 ```python def fast_pow(base, exp, mod): result = 1 while exp > 0: if exp % 2 == 1: result = (result * base) % mod base = (base * base) % mod exp = exp // 2 return result n = int(input()) while n != 0: if n == 1: print(2) else: part1 = fast_pow(2, 2*n-1, 100) part2 = fast_pow(2, n-1, 100) print((part1 + part2) % 100) n = int(input()) ``` #### 关键步骤说明 1. **快速幂算法**:用于计算$2^{2n-1}$和$2^{n-1}$的模值,时间复杂度$O(\log n)$ 2. **公式推导**:通过生成函数将组合问题转化为指数函数展开,合并后得到闭式解 3. **边界处理**:特殊处理$n=1$的情况(直接输出2) [^1]: 不同OJ平台题目可能存在差异,建议通过HDOJ官网确认题目描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值