【HDOJ】2065 “红色病毒”问题

【HDOJ】2065 “红色病毒”问题

刚开始看这道题目的时候,完全没看出来是递推。看了网上大牛的分析。立刻就明白了。
其实无论字符串长度为多少,都可以将该长度下的组合分成四种情况S1(A偶数C偶数)、S2(A偶数C奇数)、S3(A奇数C偶数)、S4(A奇数C奇数)。因此,可以由n-1长度情况下的各种情况数目推导出n长度下的数目。
fn(S1) = 2*fn-1(S1) + fn-1(S2) + fn-1(S3),同理可推导其它状态的数目
fn(S2) = 2*fn-1(S2) + fn-1(S1) + fn-1(S4)
fn(S3) = 2*fn-1(S3) + fn-1(S1) + fn-1(S4)
fn(S4) = 2*fn-1(S4) + fn-1(S2) + fn-1(S3)
由以上公式可以推导出 fn(S1) + fn(S4) = fn(S2) + fn(S3) = 4^n / 2 = 2*4^(n-1)
又因为f0(S1) = 2, f0(S2) = 1, f0(S3) = 1, f0(S4) = 0
f0(S2) = f0(S3),并且两式的推导公式相同,因此有fn(S2) = fn(S3) = 4^(n-1) = 2^(2n-2)
将其代入S1的推导式,并且递推可得fn(S1) = 2^(n-1) + 2^(2n-2)
下面就是推导规律,发现2的幂%100的周期为1,2,4,8,16,32,64,28,56,12,24,48,96,92,84,68,36,72,44,88,76,52,
然后注意讨论长度为1、2的情况,可求解。

 1 #include <stdio.h>
 2 
 3 #define PAT2NUM 20
 4 #define PAT4NUM 10
 5 
 6 int pattern[] = {
   1,2,4,8,16,32,64,28,56,12,24,48,96,92,84,68,36,72,44,88,76,52};
 7 
 8 void find(int base) {
 9     int i, j, flg, n;
10 
11     pattern[0] = 1;
12     printf("1 ");
13     n = 1;
14     for (i=1; i<50; ++i) {
15         pattern[i] = pattern[i-1]*base%100;
16         flg = 0;
17         for (j=0; j<i; ++j)
18             if (pattern[i] == pattern[j]) {
19                 flg = 1;
20                 break;
21             }
22         if (flg)
23             break;
24         ++n;
25         printf("%d ", pattern[i]);
26     }
27 }
28 
29 int main() {
30     int case_n;
31     __int64 n;
32     int i, a, b;
33 
34     while (scanf("%d", &case_n)!=EOF && case_n) {
35         for (i=1; i<=case_n; ++i) {
36             scanf("%I64d", &n);
37             printf("Case %d: ", i);
38             if (n == 1) {
39                 printf("2\n");
40                 continue;
41             }
42             if (n == 2) {
43                 printf("6\n");
44                 continue;
45             }
46             a = pattern[(n-1-2)%PAT2NUM+2];
47             b = pattern[(2*n-2-2)%PAT2NUM+2];
48             printf("%d\n", (a+b)%100);
49         }
50         printf("\n");
51     }
52 
53     return 0;
54 }

 

转载于:https://www.cnblogs.com/bombe1013/p/3651062.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/109857.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • oracle如何修改用户密码_oracle重置用户名密码

    oracle如何修改用户密码_oracle重置用户名密码轻松搞定Oracle用户密码修改 摘要:服务器更换、数据库移植都会涉及到Oracle用户密码的修改操作,这里给出几段简单的代码,帮您轻松搞定Oracle用户密码的修改操作。 我们假设这样一个应用场景,数据库需要移植,库中某一个用户的Oracle用户密码不知道,可是这个密码因为在其他程序中使用了而不能修改,在新的数据库系统中,这

    2022年7月28日
    13
  • html制作进销存,手把手教你定制属于自己的进销存软件

    html制作进销存,手把手教你定制属于自己的进销存软件接着上一步的继续来更新,上一步设置了入库单和出库单的选择录入问题下面来说一下入库单和出库单的数据保存转移问题在入库单和出库单分别插入两个按钮,然后再模块里写入一下代码Sub入库单录入()a=Sheet3.Range(“a65536”).End(xlUp).RowIfSheet3.Range(“b2”)=””ThenMsgBox”请选择录入供应商名称!”ExitSubEndI…

    2022年5月31日
    44
  • idea 202203激活码【中文破解版】2022.03.03

    (idea 202203激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html40ZKSWCX8G-eyJsaWNlbnNlSW…

    2022年3月13日
    403
  • Linux终端Web浏览器w3m

    Linux终端Web浏览器w3m

    2022年3月13日
    337
  • java保留两位小数输出,看这篇文章准没错!

    java保留两位小数输出,看这篇文章准没错!4年经验应该具备哪些技能首先,简单的聊一下我认为的4年经验左右、优秀的Java程序员应该具备的技能有哪些,按“专业技能”和“项目”两块,包括但不限于以下内容。专业技能方面基础:JDK常用类的原理、源码、使用场景。设计模式:常用几种的原理、使用场景,单例、动态代理、模板、责任链等。数据结构:数组、链表、栈、队列、树。网络:TCP、HTTP、HTTPS、负载均衡算法。框架:SpringIoC原理、SpringAOP原理和使用、Spring常用的扩展点、MyBatis的核心

    2022年7月8日
    35
  • CDMA、CDMA2000、WCDMA、TD-SCDMA的区别

    CDMA、CDMA2000、WCDMA、TD-SCDMA的区别前几日,笔者有一位朋友从网上买了一部二手的苹果iPhone4S,拿到手之后才发现,这部iPhone4S原来是电信版的,而自己用的SIM卡是中国移动的,根本没办法使用,非常的沮丧,这也怪当初购买时没有注意不同运营商之间网络不兼容的问题。其实在生活中,很多人对于手机网络方面的知识知之甚少,今天笔者就为大家介绍一下手机网络方面的一些常识,以免再次发生以上不必要的错误。GSM知多少?  说到GSM,相

    2022年9月27日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号