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

大体题意是:有两个门A和B,还有一群人,每个人都有一个数字,

疯了一样的T。。比赛的时候十连T也是醉醉的。  

这道题感觉像DP,但是不知道从何下手,看别人敲出来才知道怎么去用。

在比赛过程中还有一个问题,想法对了,样例过了,但是T了

原因是因为数组开大了,在dp的过程中用了memset,导致T

在标程里,用了滚动数组,感觉很巧妙,因为dp只需要知道上一状态即可,

利用异或的性质,不断滚动0101010101

---------------------------------------关于digital的性质------------------------------------------------------------

当一群人各位数字之和等于门上数字的时候才可以通过门,可以只通过一个门也可以两个门都通过。

The digital root of a non-negative integer is the single digit value obtained by an iterative process of summing digits,

on each iteration using the result from the previous iteration to compute a digit sum. The process continues until

a single-digit number is reached.

关于digital root(以下用R表示),有以下几条性质:

1、9加(乘)任何数所得的和(积)的数字根,等于原数的数字根(9)

2、若A+B=C,则A,B的数字根(Ra Rb)的和的数字根为C的数字根(Rc)

3、若A*B=C,则A,B的数字根(Ra Rb)的积的数字根为C的数字根(Rc)

4、若A^n=B,则Ra^n的数字跟=Rb。

------------------DP思路---------------------

dp[i+1][a[i]+k] = dp[i+1][a[i]+k] + dp[i][k];

更新加了一个数之后的状态

dp[i+1][k] = dp[i+1][k] + dp[i][k];

加上上一状态的情况数

------------------分情况讨论-------------------

之后比较巧的是对于情况的讨论

1、如果数字跟不等于A+B且不等于A且不等于B,则情况数为0

2、如果是数字根等于A+B的数字根,那么情况数就等于dp[n][A] = dp[n][B]

3、如果数字根等于A或B,那么情况数只有一个

4、如果数字跟等于A且等于B,那么情况数有两个

具体代码如下

         )==sum);
         )ans=(ans+)%MOD;
         )ans=(ans+)%MOD;

注意到后两种情况其实可以合并,如果A=B的话,后两个if语句同时成立,ans = 2;

 #include<stdio.h>
 #include<cstring>
 #include<algorithm>
 #define rep(i,j,k) for(int i=(int)j;i<(int)k;i++)
 #define per(i,j,k) for(int i=(int)j;i>(int)k;i--)
 using namespace std;
 ;
 ;
 int T, n;
 int A, B;
 int a[MAXN];
 int now, sum, ans;
 ][];
 int main(){
     scanf("%d",&T);
     while(T--){
         scanf("%d",&n);
         scanf("%d %d",&A,&B);
         A %= ;B %= ;
         sum = ;
         rep(i,,n){
             scanf("%d",&a[i]);
             a[i] = a[i] % ;
             sum = (sum+a[i])%;
         }
         ) && sum != A && sum != B){
             puts(");
             continue;
         }
         memset(dp,,sizeof(dp));
         dp[][] = ;
         now = ;
         rep(i,,n){
             now ^= ;
             rep(k,,) dp[now][k] = ;
             rep(k,,){
                 dp[now][(a[i]+k)%] = ( dp[now][(a[i]+k)%] + dp[now^][k])%MOD;
                 dp[now][k] = ( dp[now][k] + dp[now^][k])%MOD;
             }
         }
         )==sum);
         )ans=(ans+)%MOD;
         )ans=(ans+)%MOD;
         printf("%d\n",ans);
     }
 }

hdoj 5389 Zero Escape的更多相关文章

  1. 递推DP HDOJ 5389 Zero Escape

    题目传送门 /* 题意:把N个数分成两组,一组加起来是A,一组加起来是B,1<=A,B<=9,也可以全分到同一组.其中加是按照他给的规则加,就是一位一位加,超过一位数了再拆分成一位一位加. ...

  2. HDU 5389 Zero Escape(dp啊 多校)

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=5389 Problem Description Zero Escape, is a visual no ...

  3. HDU 5389 Zero Escape(DP + 滚动数组)

    Zero Escape Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) To ...

  4. hdu 5389 Zero Escape(记忆化搜索)

    Problem Description Zero Escape, is a visual novel adventure video game directed by Kotaro Uchikoshi ...

  5. hdu 5389 Zero Escape (dp)

    题目:http://acm.hdu.edu.cn/showproblem.php? pid=5389 题意:定义数根:①把每一位上的数字加起来得到一个新的数,②反复①直到得到的数仅仅有1位.给定n,A ...

  6. 2015 Multi-University Training Contest 8 hdu 5389 Zero Escape

    Zero Escape Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Tot ...

  7. HDU 5389 Zero Escape (MUT#8 dp优化)

    [题目链接]:pid=5389">click here~~ [题目大意]: 题意: 给出n个人的id,有两个门,每一个门有一个标号,我们记作a和b,如今我们要将n个人分成两组,进入两个 ...

  8. HDU 5389 Zero Escape

    题意:有一些人,每人拿一个号码,有两个门,门的值分别为A和B,要求把人分成两堆(可以为空)一堆人手持号码之和的数字根若等于A或者B就可以进入A门或者B门,要求两堆人分别进入不同的门,求有几种分配方式, ...

  9. 【HDOJ】1813 Escape from Tetris

    bfs预处理一点到边界的最小距离,IDA*求出可行方案.注意按字典序初始化dir数组.并且存在中间点全为1,边界含0的可能性(wa了很多次).此时不输出任何命令. /* 1813 */ #includ ...

随机推荐

  1. 重装yum

    1)卸载yum rpm -aq|grep yum|xargs rpm -e --nodeps 2)下载并安装python-urlgrabber,python-pycurl,yum-metadata-p ...

  2. 理解ASP.NET MVC的路由系统

    引言 路由,正如其名,是决定消息经由何处被传递到何处的过程.也正如网络设备路由器Router一样,ASP.NET MVC框架处理请求URL的方式,同样依赖于一张预定义的路由表.以该路由表为转发依据,请 ...

  3. HDU 5268 ZYB loves Score (简单模拟,水)

    题意:计算Bestcoder四题的得分. 思路:直接模拟,4项分数直接计算后输出.注意不要低于百分之40的分. //#include <bits/stdc++.h> #include &l ...

  4. HDU5400 Arithmetic Sequence

    解题思路:这题看懂题目是很关键的,这个区间是等差数列,且公差为d1或d2, 特别注意单个数字也为等差数列.每次求出等差数列序列长度,然后   求出对应这种长度对应有多少种组合方式,累加起来就是结果. ...

  5. equal 和 ==

    刚才看了一下别人的博客,想加深一下对 equal 和 == 的了解. 总结了几点: 1.equal 每个类都有必要覆盖一下,对于String 类,已经覆盖,比较的是String对象的字符序列是否相等. ...

  6. OpenVz一键安装openvpn

    # !/bin/sh # OPENVPN SERVER CONFIGURATION echo "####################################" echo ...

  7. Android下监听Home键

    网上看到demo,亲测了以下机器和设备,均测试通过: 测试通过的手机: 1.华为荣耀3(Android 4.2.2) 2.小米2s(Android 4.1.1) 3.联想的手机 (Android2.3 ...

  8. JS面向对象组件(六) -- 拖拽功能以及组件的延展

    HTML部分 <div id="div1"></div> <div id="div2"></div> CSS部分 ...

  9. 部署K2 Blackpearl流程时出错(与基础事务管理器的通信失败或Communication with the underlying transaction manager has failed.

    转:http://www.cnblogs.com/dannyli/archive/2011/12/01/2270222.html 亲,在部署K2流程是,是否遇到这个错误(以下是中.英文错误信息) 中文 ...

  10. android webview 遇到的问题:external/chromium/net/disk_cache/stat_hub.cc:216:

    今天也遇到这个问题,界面显示无法访问,Baidu吧,结果有些含糊其词,有的说加网络权限,我看了下我的, 有个 <uses-permission android:name="androi ...