题意:有一些人,每人拿一个号码,有两个门,门的值分别为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. 套题T4

    Problem 1 无聊的gcd(gcd.c/cpp/pas) 话说出题人不会被查水表吧. 简单的问题描述:从N个正整数里面取出K个数的最大公因数最大是多少.(请将答案乘上k之后输出哦,谢谢合作.) ...

  2. PHP输入流php://input [转]

    对于php://input介绍,PHP官方手册文档有一段话对它进行了很明确地概述. "php://input allows you to read raw POST data. It is ...

  3. .md文件 Markdown 语法说明

    Markdown 语法说明 (简体中文版) / (点击查看快速入门) 概述 宗旨 兼容 HTML 特殊字符自动转换 区块元素 段落和换行 标题 区块引用 列表 代码区块 分隔线 区段元素 链接 强调 ...

  4. Java 进行 RSA 加解密时不得不考虑到的那些事儿

    1. 加密的系统不要具备解密的功能,否则 RSA 可能不太合适 公钥加密,私钥解密.加密的系统和解密的系统分开部署,加密的系统不应该同时具备解密的功能,这样即使黑客攻破了加密系统,他拿到的也只是一堆无 ...

  5. Spring IoC — 基于注解的配置

    基于XML的配置,Bean定义信息和Bean实现类本身是分离的,而采用基于注解的配置方式时,Bean定义信息即通过在Bean实现类上标注注解实现. @Component:对类进行标注,Spring容器 ...

  6. RestTemplateIntegrationTests

    摘录RestTemplate的集成测试类/* 2.    * Copyright 2002-2010 the original author or authors. 3.    * 4.    * L ...

  7. url、href、src 详解

    发现自己居然没把url.href.src关系及使用搞清楚,今天就理一下.主要包括:url.src.href定义以及使用区别.顺便试下在segmentfault来一发. URL(Uniform Reso ...

  8. apk反编译(4)Smali代码注入

    转自 : http://blog.sina.com.cn/s/blog_5674d18801019i89.html 应用场景 Smali代码注入只能应对函数级别的移植,对于类级别的移植是无能为力的.具 ...

  9. Failed to initialize monitor Thread: Unable to establish loopback connection解决方法

    原因一: android中出现该异常的原因,是pid产生了冲突,将服务中的windows Firewall 服务停用就行了 原因二: http://stackoverflow.com/question ...

  10. 如何过滤 adb logcat 输出

    对原作者表示感谢,转自博客:http://www.otechu.me/zh/2011/12/filtering-adb-logcat-output/ 本文介绍如何在 shell 命令行中过滤 adb ...