Zero Escape

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)

Total Submission(s): 864    Accepted Submission(s): 438

Problem Description
Zero Escape, is a visual novel adventure video game directed by Kotaro Uchikoshi (you may hear about ever17?) and developed by Chunsoft.



Stilwell is enjoying the first chapter of this series, and in this chapter digital root is an important factor. 



This is the definition of digital root on Wikipedia:

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.

For example, the digital root of 65536 is 7,
because 6+5+5+3+6=25 and 2+5=7.



In the game, every player has a special identifier. Maybe two players have the same identifier, but they are different players. If a group of players want to get into a door numbered X(1≤X≤9),
the digital root of their identifier sum must be X.

For example, players {1,2,6} can
get into the door 9,
but players {2,3,3} can't.



There is two doors, numbered A and B.
Maybe A=B,
but they are two different door.

And there is n players,
everyone must get into one of these two doors. Some players will get into the door A,
and others will get into the door B.

For example: 

players are {1,2,6}, A=9, B=1

There is only one way to distribute the players: all players get into the door 9.
Because there is no player to get into the door 1,
the digital root limit of this door will be ignored.



Given the identifier of every player, please calculate how many kinds of methods are there, mod 258280327.
 
Input
The first line of the input contains a single number T,
the number of test cases.

For each test case, the first line contains three integers n, A and B.

Next line contains n integers idi,
describing the identifier of every player.

T≤100, n≤105, ∑n≤106, 1≤A,B,idi≤9
 
Output
For each test case, output a single integer in a single line, the number of ways that these n players
can get into these two doors.
 
Sample Input
4
3 9 1
1 2 6
3 9 1
2 3 3
5 2 3
1 1 1 1 1
9 9 9
1 2 3 4 5 6 7 8 9
 
Sample Output
1
0
10
60
 
Author
SXYZ
 
Source
 



   题意:给出n个人的id,有两个门,每一个门有一个标号,我们记作a和b,如今我们要将n个人分成两组。进入两个门中,使得两部分人的标号的和(迭代的求,直至变成一位数)各自等于a和b,问有多少种分法,(能够全部的人进入一个门)。



pid=5389">点击打开链接

pt = j - p[i];

状态转移方程: dp[i][j] = dp[i-1][j] + dp[i-1][pt];

两种处理方法:

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<stdlib.h> using namespace std; const int N = 100001;
const int mod = 258280327;
int dp[N][10];
int n,a,b;
int p[N]; int num(int xx,int yy)
{
int t = xx + yy;
if(t%9 == 0)
{
return 9;
}
return t%9;
} int pnum(int xx,int yy)
{
int tt = xx - yy;
if(tt%9 == 0)
{
return 9;
}
if(tt%9<0)
{
return 9+(tt%9);
}
return tt%9;
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int sum = 0;
scanf("%d%d%d",&n,&a,&b);
for(int i=1;i<=n;i++)
{
scanf("%d",&p[i]);
sum = num(sum,p[i]);
}
memset(dp,0,sizeof(dp));
dp[0][0] = 1;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=9;j++)
{
dp[i][j] += dp[i-1][j];
dp[i][j] = dp[i][j]%mod;
int pt = pnum(j,p[i]);
if(pt == 9)
{
dp[i][j] += max(dp[i-1][0],dp[i-1][9]);
}
else
{
dp[i][j] += dp[i-1][pnum(j,p[i])];
}
dp[i][j] = dp[i][j]%mod;
}
}
int ans = 0;
if(num(a,b) == sum)
{
ans = dp[n][a];
if(a == sum)
{
ans--;
}
}
if(a == sum)
{
ans++;
}
if(b == sum)
{
ans++;
}
printf("%d\n",ans);
}
return 0;
}

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<stdlib.h> using namespace std; const int N = 100001;
const int mod = 258280327;
int dp[N][10];
int n,a,b;
int p[N]; int num(int xx,int yy)
{
int t = xx + yy;
if(t%9 == 0)
{
return 9;
}
return t%9;
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int sum = 0;
scanf("%d%d%d",&n,&a,&b);
for(int i=1;i<=n;i++)
{
scanf("%d",&p[i]);
sum = num(sum,p[i]);
}
memset(dp,0,sizeof(dp));
dp[0][0] = 1;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=9;j++)
{
int pt = num(j,p[i]);
dp[i][j]+=dp[i-1][j];
dp[i][pt]+=dp[i-1][j];
dp[i][j]%=mod;
dp[i][pt]%=mod;
}
}
int ans = 0;
if(num(a,b) == sum)
{
ans = dp[n][a];
if(a == sum)
{
ans--;
}
}
if(a == sum)
{
ans++;
}
if(b == sum)
{
ans++;
}
printf("%d\n",ans);
}
return 0;
}

HDU 5389 Zero Escape(DP + 滚动数组)的更多相关文章

  1. hdu 4576 (简单dp+滚动数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4576 题意:给出1~n的环,m个操作,每次能顺时针或逆时针走w步,询问最后在l~r这段区间内概率.(1 ...

  2. hdu5389 Zero Escape DP+滚动数组 多校联合第八场

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

  3. HDU - 2294 Pendant (DP滚动数组降维+矩阵高速功率)

    Description On Saint Valentine's Day, Alex imagined to present a special pendant to his girl friend ...

  4. hdu 5389 Zero Escape (dp)

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

  5. HDU 1024 Max Sum Plus Plus --- dp+滚动数组

    HDU 1024 题目大意:给定m和n以及n个数,求n个数的m个连续子系列的最大值,要求子序列不想交. 解题思路:<1>动态规划,定义状态dp[i][j]表示序列前j个数的i段子序列的值, ...

  6. HDU 5119 Happy Matt Friends (背包DP + 滚动数组)

    题目链接:HDU 5119 Problem Description Matt has N friends. They are playing a game together. Each of Matt ...

  7. POJ 3666 Making the Grade (DP滚动数组)

    题意:农夫约翰想修一条尽量平缓的路,路的每一段海拔是A[i],修理后是B[i],花费|A[i] – B[i]|,求最小花费.(数据有问题,代码只是单调递增的情况) #include <stdio ...

  8. USACO 2009 Open Grazing2 /// DP+滚动数组oj26223

    题目大意: 输入n,s:n头牛 s个栅栏 输入n头牛的初始位置 改变他们的位置,满足 1.第一头与最后一头的距离尽量大 2.相邻两头牛之间的距离尽量满足 d=(s-1)/(n-1),偏差不超过1 3. ...

  9. hdu 1513 && 1159 poj Palindrome (dp, 滚动数组, LCS)

    题目 以前做过的一道题, 今天又加了一种方法 整理了一下..... 题意:给出一个字符串,问要将这个字符串变成回文串要添加最少几个字符. 方法一: 将该字符串与其反转求一次LCS,然后所求就是n减去 ...

随机推荐

  1. 字符串格式化输出、while循环、运算符、编码

    1.字符串格式化输出 %占位符: %s => 字符串 %d=>整数型 %%=>转义 普通的% %()不能多,不能少,一一对应 f"{}"大括号里的内容一般都放变量 ...

  2. confluence6.0.3安装文档

    一.Atlassian Confluence 6.0.3安装文档包含内容 1.wiki的安装步骤: 2.旧系统迁移中碰到的无法编辑和问题和解决方案: 3.wiki源码安装包.连接mysql用的jar包 ...

  3. appium ios端自动化测试配置

    一.安装环境介绍macOS 10.12.4 Xcode 8.3.2 适用机型:iOS9 及以上机型 二.Appium源码安装Xcode升级8.2之后不再支持UIAutomation,转而使用XCUIT ...

  4. NOIp2018模拟赛三十八

    爆〇啦~ A题C题不会写,B题头铁写正解: 随手过拍很自信,出分一看挂成零. 若要问我为什么?gtmdsubtask! 神tm就一个subtask要么0分要么100,结果我预处理少了一点当场去世 难受 ...

  5. java读取excel文件内容

    1.导入依赖JAR包 <!-- jxl 操作excel --> <dependency> <groupId>org.jxls</groupId> < ...

  6. LaTeX argmin argmax 下标使用方法

    本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50036001 LaTeX中,使用arg ...

  7. Unity 相机花式分屏

    花式分屏,顾名思义,可以实现各种不规则几何边界的分屏,是无法直接通过调整相机视口能达到效果的(只能实现矩形的分屏),例如斜对角分屏,几何图形分屏: 假设我们有两个相机,需要上面的斜对角分屏画面,和镜子 ...

  8. Asterisk[1]

    Asterisk[1]是一款GPLv2协议下的开源电话应用平台.简单来说,Asterisk是一个server应用.可以完毕发起电话呼叫.接受电话呼叫.对电话呼叫进行定制处理. 1.2.1 通道驱动 a ...

  9. Android Camera+SurfaceView实现自己定义拍照

    对Activity强制横屏,保证预览方向正确. 使用OrientationEventListener监听设备方向.推断竖拍时,旋转照片后再保存.保证竖拍时预览图片和保存后的图片方向一致. 执行效果: ...

  10. Python: PS 滤镜--碎片特效

    本文用 Python 实现 PS 滤镜中的碎片特效,这个特效简单来说就是将图像在 上,下,左,右 四个方向做平移,然后将四个方向的平移的图像叠加起来做平均.具体的效果图可以参考之前的博客 http:/ ...