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

解法:dp。比赛的时候并不知道一个数%9+1就是数字根……煞费苦心的算了半天……只得出结论a+b的数字根等于a的数字根+b的数字根的数字根……没打表……于是T了……然后打了个表才过orz

设dp[i][j]表示用前i个人获得数字根为j的和的方案数,打一个表vector<int> tab[i][j]表示和j相加的数字根等于i的数。则可以得到方程dp[i][j] = dp[i - 1][j] + ∑dp[i - 1][tab[j][a[i]][k]],dp[i - 1][j]表示不选第i个数,后面的和表示选第i个数时可以转移来的所有状态之和。

答案即为dp[n][A],但是当A和B相等时,多出一种A选0个人的方案,需要特判。

代码:

因为一开始没想到上面那个特判……想了好多乱七八糟的特判= =代码好乱……【无视无视

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <limits.h>
using namespace std;
typedef long long LL;
const LL mod = 258280327;
int t, n, A, B;
int get_num(int x)
{
int tmp = x;
while(tmp >= 10)
{
x = tmp;
tmp = 0;
while(x)
{
tmp += x % 10;
x /= 10;
}
}
return tmp;
}
vector <int> tab[10][10];
void init()
{
for(int i = 1; i <= 9; i++)
for(int j = 1; j <= 9; j++)
for(int k = 0; k <= 9; k++)
{
if(get_num(k + j) == i)
tab[i][j].push_back(k);
}
}
LL dp[100005][11];
LL a[100005];
int main()
{
init();
scanf("%d", &t);
while(t--)
{
scanf("%d%d%d", &n, &A, &B);
memset(dp, 0, sizeof dp);
LL sum = 0;
for(int i = 1; i <= n; i++)
{
scanf("%lld", &a[i]);
sum += a[i];
}
for(int i = 0; i <= n; i++)
dp[i][0] = 1;
LL ans = 0;
int tmp = get_num(sum);
if(tmp != get_num(A + B))
{
if(tmp == A && tmp == B)
{
printf("2\n");
continue;
}
else if(tmp == A)
{
printf("1\n");
continue;
}
else if(tmp == B)
{
printf("1Zn");
continue;
}
else
{
printf("0\n");
continue;
}
}
if(sum == A)
{
if(sum == B)
{
printf("2\n");
continue;
}
else
{
printf("1\n");
continue;
}
}
else if(sum == B)
{
printf("1\n");
continue;
}
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= 9; j++)
{
dp[i][j] += dp[i - 1][j];
int len = tab[j][a[i]].size();
for(int k = 0; k < len; k++)
{
dp[i][j] += dp[i - 1][tab[j][a[i]][k]];
if(dp[i][j] > mod)
dp[i][j] -= mod;
}
}
}
ans = dp[n][A];
if(get_num(sum) == B)
ans++;
printf("%lld\n", ans);
}
return 0;
}

  

HDU 5389 Zero Escape的更多相关文章

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

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

  2. hdu 5389 Zero Escape (dp)

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

  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. 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 ...

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

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

  7. 递推DP HDOJ 5389 Zero Escape

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

  8. hdoj 5389 Zero Escape

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5389 大体题意是:有两个门A和B,还有一群人,每个人都有一个数字, 疯了一样的T..比赛的时候十连T也 ...

  9. HDU 3605:Escape(最大流+状态压缩)

    http://acm.hdu.edu.cn/showproblem.php?pid=3605 题意:有n个人要去到m个星球上,这n个人每个人对m个星球有一个选择,即愿不愿意去,"Y" ...

随机推荐

  1. 2016,除了 DevOps,企业还应该知道 CMDB!

    CMDB 是 Configuration Management Database(配置管理数据库)的简称,CMDB 存储与管理企业 IT 架构中设备的各种配置信息,它与所有服务支持和服务交付流程都紧密 ...

  2. CPU/ABI显示No system images installed for this target的解决方案

    CPU/ABI显示No system images installed for this target的解决方案 手动下载image http://www.androiddevtools.cn/ SD ...

  3. SPOJ 3693 Maximum Sum(水题,记录区间第一大和第二大数)

    #include <iostream> #include <stdio.h> #include <algorithm> #define lson rt<< ...

  4. java基础知识回顾之javaIO类--内存操作流ByteArrayInputStream和ByteArrayOutputSteam(操作字节数组)

    直接看代码: package cn.itcast.io.p6.bytestream; import java.io.ByteArrayInputStream; import java.io.ByteA ...

  5. SQLMap使用

    http://www.freebuf.com/articles/web/29942.html http://sqlmap.org/ http://blog.csdn.net/zgyulongfei/a ...

  6. POJ1416Shredding Company

    http://poj.org/problem?id=1416 题意 : 要为碎纸机公司开发一种新的碎纸机,这种碎纸机要具有3个特性 :一是粉碎机以一个目标数 t 作为输入,并且粉碎的纸上写有一个数字n ...

  7. python 利用pop3接收邮件并保存附件

    def SaveAttach():# login the pop3 server ,retrive the new mails ,and download the attachments dstdir ...

  8. OSSEC 安装执行./install.sh详细信息

    下载好ossec安装文件后解压得到如下目录 [root@localhost ~]# cd ossec-hids-/ [root@localhost ossec-hids-]# ll total drw ...

  9. PHP的线程安全与非线程安全版本的区别

    Windows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分,这两者不同在于何处?到底应该用哪种?这里做一个简单的介绍. ...

  10. 注意:C++中double的表示是有误差的

    注意:C++中double的表示是有误差的,直接通过下面的例子看一下 #include<iostream> using namespace std; int main() { double ...