【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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 第一个项目:用python获取qq账号和密码「建议收藏」

    第一个项目:用python获取qq账号和密码「建议收藏」用python获取qq账号和密码第一个项目:用python获取qq账号和密码第一个项目:用python获取qq账号和密码2020/1/22用python获取qq账号和密码,但实际上获取的密码是加密状态的,待探索如何解秘或不多说先上代码:importrequestsimportrandomheader={‘user-agent’:’Mozilla/5.0(Linux;An…

    2022年7月20日
    27
  • dota2已连接协调服务器,正在登陆中的解决办法「建议收藏」

    dota2已连接协调服务器,正在登陆中的解决办法「建议收藏」这两天,家里有亲戚过世,暗恋的小姑娘跟别人出去玩了,心情不好,打开dota2,连了好几次都没连上,按网上的说法清除缓存,重启电脑都试过了,不行,后来发现,我是手机开的热点,这里信号不好,换一个信号好的卡就行了,很多关于网络的问题其实都和网速有关,因为网速不合格和断网基本上是同一个问题,所以一般会引起混淆。…

    2022年5月17日
    141
  • Unreal Engine 4 RenderTarget制作Live Camera效果

    Unreal Engine 4 RenderTarget制作Live Camera效果

    2022年1月19日
    49
  • Error: org.apache.axis2.AxisFault at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430) at 的原因

    Error: org.apache.axis2.AxisFault at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430) at 的原因Error:org.apache.axis2.AxisFaultatorg.apache.axis2.AxisFault.makeFault(AxisFault.java:430)atorg.apache.axis2.description.AxisService.createService(AxisService.java:2504)atorg.apache.axis2.des

    2025年9月5日
    4
  • Drupal教程之安装篇

    Drupal教程之安装篇星期一,01/12/2009—似曾相识文章地址:[url]http://www.drupaluser.org/node/3[/url]象许多CMS一样,Drupal也是需要安装,其主要步骤如下(以[url]http://drupaluser.org/[/url]为例):1.在[url]http://drupaluser.org/[/u…

    2022年6月8日
    29
  • Image.open()_image.open函数

    Image.open()_image.open函数文章目录1导入库2图像读取3读入图片类型4通道5显示方法6相互转换Image.open()和ci2.imread()都是用来读取的图像,但在使用过程中存在一些差别。具体,可以从以下几个角度进行分析:1导入库导入的包不同。img=cv2.imread(path),这是opencv中的处理图片的函数,使用时需importcv2img=Image.open(path),这是PIL中的一个处理图片的函数,使用时需fromPILimportImage#opencv-py

    2022年10月14日
    2

发表回复

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

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