博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 4669 Mutiples on a circle(环状DP)
阅读量:5297 次
发布时间:2019-06-14

本文共 1745 字,大约阅读时间需要 5 分钟。

这是最早看懂题意的一题,状态转移,挺好想。。但是比赛时候,就是没有想到怎么去重,而且当时有些情况,也没注意到。

先预处理的dp[0]的情况,就是以p[0]为结尾的情况。之后D就行了,例如样例此位6,去重只要把642896 去掉就行了,dp[1][642896%m] --;注意这个值的更新。

突然发现。

1 #include 
2 #include
3 using namespace std; 4 #define LL __int64 5 int dp[50100][201]; 6 int p[50100]; 7 int d[50100]; 8 int po[200100]; 9 int fun(int x)10 {11 int i = 0;12 while(x)13 {14 i ++;15 x = x/10;16 }17 return i;18 }19 int main()20 {21 int n,m,i,j,sum,pre;22 while(scanf("%d%d",&n,&m)!=EOF)23 {24 for(i = 0;i <= n;i ++)25 {26 for(j = 0;j < m;j ++)27 dp[i][j] = 0;28 }29 po[0] = 1;30 for(i = 1;i <= 4*n;i ++)31 {32 po[i] = (po[i-1]*10)%m;33 }34 for(i = 0;i < n;i ++)35 {36 scanf("%d",&p[i]);37 d[i] = fun(p[i]);38 }39 p[n] = p[0];40 d[n] = d[0];41 sum = 0;42 pre = 0;43 for(i = n;i > 0;i --)44 {45 sum = (p[i]*po[pre] + sum)%m;46 pre += d[i];47 dp[0][sum] ++;48 }49 for(i = 1;i < n;i ++)50 {51 for(j = 0;j < m;j ++)52 {53 dp[i][(j*po[d[i]]+p[i])%m] += dp[i-1][j];54 }55 sum = (sum*po[d[i]] + p[i])%m;56 dp[i][sum] --;57 dp[i][p[i]%m] ++;58 sum = (sum - po[pre]*p[i])%m;59 if(sum < 0)60 sum += m;61 }62 LL ans = 0;63 for(i = 0;i < n;i ++)64 {65 ans += dp[i][0];66 }67 printf("%I64d\n",ans);68 }69 return 0;70 }

 

 

转载于:https://www.cnblogs.com/naix-x/p/3257358.html

你可能感兴趣的文章
TC SRM 593 DIV1 250
查看>>
SRM 628 DIV2
查看>>
2018-2019-2 20165314『网络对抗技术』Exp5:MSF基础应用
查看>>
Python-S9-Day127-Scrapy爬虫框架2
查看>>
使用Chrome(PC)调试移动设备上的网页
查看>>
使用gitbash来链接mysql
查看>>
SecureCRT的使用方法和技巧(详细使用教程)
查看>>
右侧导航栏(动态添加数据到list)
查看>>
81、iOS本地推送与远程推送详解
查看>>
虚拟DOM
查看>>
uva 11468 Substring
查看>>
自建数据源(RSO2)、及数据源增强
查看>>
BootStrap2学习日记2--将固定布局换成响应式布局
查看>>
关于View控件中的Context选择
查看>>
2018icpc徐州OnlineA Hard to prepare
查看>>
Spark的启动进程详解
查看>>
使用命令创建数据库和表
查看>>
数据库的高级查询
查看>>
机器视觉:SSD Single Shot MultiBox Detector
查看>>
五子棋项目的实现(二)博弈树算法的描述
查看>>