题意:给你N个珠宝和一个K,每个珠宝上面都有数字,这个珠宝做成项链,把珠宝上的数字拼起来如果可以整除掉K,那么久说这个数字为wonderful value,问你有多少种方案可以组成WONDERFUL VALUE。

对每个数取余并记录多少位,这样的话拼数的时候好操作。详细解法贴个结题报告吧。

代码:

 #include <iostream>
#include <stdio.h>
using namespace std;
int dp[][];
int a[];
int len[];
int decmod[<<];
int digit(int a)
{
int len = ; while(a)
{
a /= ;
len++;
} return len;
}
void getdecmod(int k,int n)
{
decmod[] = ;
int i;
for(i = ;i <= n<<;i++)
{
decmod[i] = (decmod[i-]*)%k;
}
}
int main()
{
int n,k; while(~scanf("%d %d",&n,&k))
{
int j,i;
for(i = ;i <= n;i++)
scanf("%d",&a[i]),a[i+n] = a[i];
getdecmod(k,n);
for(i = ;i <= n;i++)
{
for(j = ;j < k;j++)
dp[i][j] = ;
}
int r ;
for(i = ;i <= n;i++)
{
len[i+n] = len[i] = digit(a[i]);
r = a[i] = a[i+n] = a[i]%k;
dp[i][r]++;
} r = a[];
int sublen = ;
for(i = n;i > ;i--)
{
sublen += len[i+];
r = (a[i]*decmod[sublen]+r)%k;
dp[][r]++; }
sublen = ;
for(i = ;i<= n;i++)
sublen += len[i];
int last;
last = r;
// printf("%d--------------\n",last);
__int64 ans = dp[][];
for(i = ;i <= n;i++)
{
for(j =;j < k;j++)
{
r = (j*decmod[len[i]]+a[i])%k;
dp[i][r] += dp[i-][j];
}
last = (last*decmod[len[i]]+a[i])%k;
dp[i][last]--;
last = (last-(a[i]*decmod[sublen])%k+k)%k;
ans += dp[i][];
} printf("%I64d\n",ans);
}
}

HDU 4669 Mutiples on a circle 不知道该归为哪一类。的更多相关文章

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

  2. HDU 4669 Mutiples on a circle 数位DP

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4669 考察对取模的的理解深不深刻啊,当然还有状态的设计····设d[i][j]表示以第i个数结尾,余 ...

  3. HDU 4669 Mutiples on a circle (DP , 统计)

    转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 题意:给出一个环,每个点是一个数字,取一个子串,使 ...

  4. HDU 4669 Mutiples on a circle(环状DP)

    题目链接 这是最早看懂题意的一题,状态转移,挺好想..但是比赛时候,就是没有想到怎么去重,而且当时有些情况,也没注意到. 先预处理的dp[0]的情况,就是以p[0]为结尾的情况.之后D就行了,例如样例 ...

  5. HDU 4669 Mutiples on a circle 动态规划

    参考了官方题解给的方法: 对于处理循环,官方给了一种很巧妙的方法: #include <cstdio> #include <cstring> #include <cstd ...

  6. HDU 4665 Mutiples on a circle (圆环DP)

    题意 N个数的圆环上有多少种方案可以使得选出来的一段数是K的倍数(N<=50000, K<=200, a[i]<=1000). 思路 多校第七场1004.圆上的DP--大脑太简单处理 ...

  7. HDU-4669 Mutiples on a circle 环形DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4669 题意:给一串数字连乘一个环,求连续的子串中组成的新的数字能被K整除的个数. 首先容易想到用DP来 ...

  8. hdu 4669 模拟

    思路: 主要就是模拟这些操作,用链表果断超时.改用堆栈模拟就过了 #include<map> #include<set> #include<stack> #incl ...

  9. hdu 4669 动态规划

    思路:主要就是一个动态方程dp[now][(j*Exp[len[num[i]]]+num[i])%k]+=dp[pre][j];我用的是滚动数组.其实也就是dp[i][(j*Exp[len[num[i ...

随机推荐

  1. JS:parseInt("08")或parseInt("09")转换返回0的原因

    一.parseInt用法 parseInt(s); parseInt(s,radix) 二.第一个方式不再多说,第二个方式,radix是s所基于的进制.范围为2-36(不在此范围函数将返回NaN). ...

  2. JavaScript-dom1

    获取事件源 var div = document.getElementById("box"); // var arr1 = document.getElementsByTagNam ...

  3. Hive的metastore

    hive --service metastore 默认端口是9083 <property> <name>hive.metastore.uris</name> < ...

  4. Druid学习之路 (五)Druid的数据摄取任务类型

    作者:Syn良子 出处:https://www.cnblogs.com/cssdongl/p/9885534.html 转载请注明出处 Druid的数据摄取任务类型 Druid支持很多种类型的数据摄取 ...

  5. U盘在制作Ubuntu启动盘后Windows系统下显示空间不对的解决办法(Ubuntu系统下格式化U盘的方法)

    用Ubuntu系统自带的启动盘制作工具后,将U盘拿到Windows系统下使用显示出的空间与U盘大小不同. 解决该问题的办法: 使用Linux终端: 第一步:sudo fdisk -l 这个命令主要是查 ...

  6. Linux Swap交换分区介绍

    Swap分区在系统的物理内存不够用的时候,把物理内存中的一部分空间释放出来,以供当前运行的程序使用.那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap分区中, ...

  7. Python3.x:抢票

    Python3.x:抢票 一个妹子叫我帮她买动车票,结果竟然没买到票:好吧,不好意思说买不到票,写个抢票程序来完成吧: 1,Chromediver安装: 因为需要chrome支持页面测试,所以需要安装 ...

  8. jQuery height() 需要注意的地方

    var aNode = $('#id'); var height = aNode.height(); //如果在获取height前,aNode已经是display:none 或者说 aNode是隐藏的 ...

  9. 20145313张雪纯 《Java程序设计》第6周学习总结

    20145313张雪纯 <Java程序设计>第6周学习总结 教材学习内容总结 将数据从来源中取出,可以使用输入串流:将数据写入目的地,可以使用输出串流. 输入串流代表对象为java.io. ...

  10. 【前端】Vue.js实现简单价格计算器

    价格计算器 实现效果: 实现代码及注释: <!DOCTYPE html> <html> <head> <title>价格计算器</title> ...