HDU 4669 Mutiples on a circle 动态规划
参考了官方题解给的方法:

对于处理循环,官方给了一种很巧妙的方法:

#include <cstdio>
#include <cstring>
#include <cstdlib> #define LL long long int const int MAXN = ;
const int MAXMOD = ; int N, K;
int dp[MAXN][MAXMOD];
int val[MAXN];
int fac[MAXN << ];
int len[]; void init()
{
for ( int i = ; i < ; ++i ) len[i] = ;
for ( int i = ; i < ; ++i ) len[i] = ;
for ( int i = ; i < ; ++i ) len[i] = ;
for ( int i = ; i < ; ++i ) len[i] = ;
return;
} void GetFac()
{
fac[] = ;
int lenn = (N << );
for ( int i = ; i < lenn; ++i )
fac[i] = ( fac[i - ] * ) % K;
return;
} int main()
{
//freopen( "1004.in", "r", stdin );
//freopen( "ss.out", "w", stdout );
init();
while ( ~scanf("%d%d", &N, &K ) )
{
for ( int i = ; i < N; ++i )
scanf( "%d", &val[i] );
GetFac(); val[N] = val[];
int sum = ;
int totL = ; //不要用memset,否则会超时
for ( int i = ; i <= N; ++i )
for ( int j = ; j <= K; ++j )
dp[i][j] = ; for ( int i = N; i > ; --i )
{
sum = ( val[i] * fac[totL] + sum ) % K;
totL += len[ val[i] ];
++dp[][sum];
} LL ans = dp[][];
for ( int i = ; i < N; ++i )
{
for ( int j = ; j < K; ++j )
dp[i][ ( j * fac[ len[ val[i] ] ] + val[i] ) % K ] += dp[i - ][j];
sum = ( sum * fac[ len[ val[i] ] ] + val[i] ) % K;
--dp[i][sum];
++dp[i][ val[i]%K ];
sum = ( ( sum - val[i] * fac[totL] ) % K + K ) % K;
ans += dp[i][];
} printf( "%I64d\n", ans );
}
return ;
}
HDU 4669 Mutiples on a circle 动态规划的更多相关文章
- HDU 4669 Mutiples on a circle (2013多校7 1004题)
Mutiples on a circle Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Oth ...
- HDU 4669 Mutiples on a circle 数位DP
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4669 考察对取模的的理解深不深刻啊,当然还有状态的设计····设d[i][j]表示以第i个数结尾,余 ...
- HDU 4669 Mutiples on a circle(环状DP)
题目链接 这是最早看懂题意的一题,状态转移,挺好想..但是比赛时候,就是没有想到怎么去重,而且当时有些情况,也没注意到. 先预处理的dp[0]的情况,就是以p[0]为结尾的情况.之后D就行了,例如样例 ...
- HDU 4669 Mutiples on a circle (DP , 统计)
转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove 题意:给出一个环,每个点是一个数字,取一个子串,使 ...
- HDU 4669 Mutiples on a circle 不知道该归为哪一类。
题意:给你N个珠宝和一个K,每个珠宝上面都有数字,这个珠宝做成项链,把珠宝上的数字拼起来如果可以整除掉K,那么久说这个数字为wonderful value,问你有多少种方案可以组成WONDERFUL ...
- HDU 4665 Mutiples on a circle (圆环DP)
题意 N个数的圆环上有多少种方案可以使得选出来的一段数是K的倍数(N<=50000, K<=200, a[i]<=1000). 思路 多校第七场1004.圆上的DP--大脑太简单处理 ...
- hdu 4669 动态规划
思路:主要就是一个动态方程dp[now][(j*Exp[len[num[i]]]+num[i])%k]+=dp[pre][j];我用的是滚动数组.其实也就是dp[i][(j*Exp[len[num[i ...
- HDU-4669 Mutiples on a circle 环形DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4669 题意:给一串数字连乘一个环,求连续的子串中组成的新的数字能被K整除的个数. 首先容易想到用DP来 ...
- hdu 1159 Palindrome(回文串) 动态规划
题意:输入一个字符串,至少插入几个字符可以变成回文串(左右对称的字符串) 分析:f[x][y]代表x与y个字符间至少插入f[x][y]个字符可以变成回文串,可以利用动态规划的思想,求解 状态转化方程: ...
随机推荐
- 【洛谷P1967】[NOIP2013]货车运输
货车运输 题目链接 显然,从一点走到另一点的路径中,最小值最大的路径一定在它的最大生成树上 所以要先求出最大生成树,再在生成树上找最近公共祖先,同时求出最小值. #include<iostrea ...
- C#中this保留字的用法
一.this保留字 this保留字一般只在构造函数.类的方法和类的实例中使用.它有以下含义: ?在类的构造函数中出现的this,则作为一个值类型,表示对正在构造的对象本身的引用. ?在类的方法中出现的 ...
- CTS、CLS、CLR分别作何解释?
CTS.CLS.CLR分别作何解释? 答:CTS:通用类型系统.CLS:通用语言规范.CLR:公共语言运行库.
- GCD中的线程死锁问题
GCD 确实好用 ,很强大,相比NSOpretion 无法提供 取消任务的功能. 如此强大的工具用不好可能会出现线程死锁. 如下代码: - (void)viewDidLoad { [super vie ...
- 学习vue-cli3的项目搭建
安装 关于旧版本 Vue CLI 的包名称由 vue-cli 改成了 @vue/cli. 如果你已经全局安装了旧版本的 vue-cli(1.x 或 2.x),你需要先通过 npm uninstall ...
- AMD、CMD、Common规范及对比
https://blog.csdn.net/bluesky1215/article/details/71081780 1.名词解释 AMD:Asynchronous Modules Definiti ...
- HDU2837 Calculation(扩展欧拉定理)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- Mysql: pt-table-checksum 和 pt-table-sync 检查主从一致性,实验过程
一.安装 percona 包 1.安装仓库的包 https://www.percona.com/doc/percona-repo-config/yum-repo.html sudo yum insta ...
- 用js控制单选框或者多选框问题
出现如图问题时,这时不能用attr方法添加checked属性了,改用$( "input" ).prop( "checked", true ),完美解决.
- request中的那些方法到底是干什么的?
最近做Java Web项目,在.jsp页面和servlet之间request和response还是有些混淆,查阅了一些资料,总结如下,方便以后使用: 首先,servlet接口是最基本的,提供的五个方法 ...