寒假第七周 2.22 --- 2.28
新的一周^w^
2.22
cf 628d Magic Numbers
自己的状态定义错了
应该是 dp[i][j][0] 前 i 位 有一位是小于的,dp[i][j][1] 前 i 位都是相同的
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<vector> 6 using namespace std; 7 8 const int mod = 1e9+7; 9 typedef long long LL; 10 const int maxn = 2005; 11 LL dp[maxn][maxn][2]; 12 int m,d,n,f[maxn][maxn]; 13 char s[maxn],p[maxn]; 14 15 LL solve(char* t){ 16 memset(dp,0,sizeof(dp)); 17 int v = t[1]-'0'; 18 for(int i = 1;i <= t[1]-'0';i++){ 19 if(i == d) continue; 20 if(i == v) dp[1][v%m][1] += 1LL; 21 else dp[1][i%m][0] += 1LL; 22 // printf("dp[1][%d][0] = %d dp[1][%d][1] = %d\n",i%2,dp[1][i%m][0],i%2,dp[1][i%m][1]); 23 } 24 25 for(int i = 2;i <= n;i++){ 26 for(int j = 0;j < m;j++){ 27 if(i%2){ 28 for(int k = 0;k <= 9;k++){ 29 if(k == d) continue; 30 dp[i][(j*10+k)%m][0] += dp[i-1][j][0]; 31 if(k == t[i]-'0') dp[i][(j*10+k)%m][1] += dp[i-1][j][1]; 32 if(k < t[i]-'0') dp[i][(j*10+k)%m][0] += dp[i-1][j][1]; 33 } 34 } 35 else{ 36 dp[i][(j*10+d)%m][0] += dp[i-1][j][0]; 37 if(d == t[i]-'0') dp[i][(j*10+d)%m][1] += dp[i-1][j][1]; 38 if(d < t[i]-'0') dp[i][(j*10+d)%m][0] += dp[i-1][j][1]; 39 } 40 dp[i][j][0] %= mod; 41 dp[i][j][1] %= mod; 42 // printf(">_<dp[%d][%d][0] = %d ",i,j,dp[i][j][0]); 43 // printf("dp[%d][%d][1] = %d\n",i,j,dp[i][j][0]); 44 } 45 } 46 // printf("dp[%d][0][0] = %d",n,dp[n][0][0]); 47 // printf(" dp[%d][0][1] = %d\n",n,dp[n][0][1]); 48 return (dp[n][0][0]+dp[n][0][1])%mod; 49 } 50 51 int ok(char* s){ 52 for(int i = 1;i <= n;i++){ 53 if(i%2 == 1 && (s[i]-'0') == d) return 0; 54 if(i%2 == 0 && (s[i]-'0') != d) return 0; 55 } 56 LL res = 0; 57 for(int i = 1;i <= n;i++){ 58 res = (res*10+(s[i]-'0'))%m; 59 } 60 if(res == 0) return 1; 61 return 0; 62 } 63 64 int main(){ 65 while(scanf("%d %d",&m,&d) != EOF){ 66 scanf("%s",s+1); 67 scanf("%s",p+1); 68 n = strlen(s+1); 69 LL l = solve(s); 70 LL r = solve(p); 71 LL ans = (r-l+mod)%mod; 72 if(ok(s)) ans++; 73 printf("%I64d\n",ans); 74 } 75 return 0; 76 }
View Code
cf 629 c Famil Door and Brackets
dp[i][j] 表示前i个平衡度为 j 的方案数
先不理解平衡度,就是 ( = 1, ) = -1 这样来算前缀和
然后后来不理解dp[i][j] 的转移
dp[i][j] += dp[i-1][j-1] 表示第i位是一个 (
dp[i][j] += dp[i-1][j+1]表示第i位是一个 )
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 7 typedef long long LL; 8 const int mod = 1e9+7; 9 const int maxn = 5e5+5; 10 char s[maxn]; 11 LL dp[2005][2005]; 12 int n,m; 13 14 void solve(){ 15 int minn = 1e9+7,pre = 0; 16 for(int i = 1;i <= m;i++){ 17 if(s[i] == '(') pre++; 18 else pre--; 19 minn = min(minn,pre); 20 } 21 LL ans = 0LL; 22 int st = 0; 23 if(minn < 0) st = -minn; 24 for(int i = 0;i <= n-m;i++){ 25 for(int j = st;j <= i;j++){ 26 if(pre+j > 2000) continue; 27 LL tmp = dp[i][j]*dp[n-m-i][pre+j]%mod; 28 ans += 1LL*tmp; 29 ans %= mod; 30 } 31 } 32 printf("%I64d\n",ans); 33 } 34 35 int main(){ 36 memset(dp,0,sizeof(dp)); 37 dp[0][0] = 1LL; 38 for(int i = 1;i <= 2000;i++){ 39 for(int j = 0;j <= i;j++){ 40 if(j > 0) dp[i][j] += dp[i-1][j-1]; 41 if(j+1 <= i) dp[i][j] += dp[i-1][j+1]; 42 dp[i][j] %= mod; 43 } 44 } 45 46 /* for(int i = 1;i <= 10;i++){ 47 for(int j = 0;j <= i;j++) printf("dp[%d][%d] = %d\n",i,j,dp[i][j]); 48 }*/ 49 50 while(scanf("%d %d",&n,&m) != EOF){ 51 scanf("%s",s+1); 52 solve(); 53 } 54 return 0; 55 }
View Code
2.23
HDU 2089
第一道数位dp ^w^
因为数组开大了t了好几次
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 7 int n,m; 8 int dp[15][15][2],d[1005]; 9 10 int dfs(int p,int pre,int flag){ 11 if(p <= 0) return 1; 12 if(dp[p][pre][flag] != -1) return dp[p][pre][flag]; 13 int res = 0,top = (flag == 1)?9:d[p]; 14 for(int i = 0;i <= top;i++){ 15 // printf(">_<p = %d pre = %d i = %d\n",p,pre,i); 16 if(i == 4||(pre == 6 && i == 2)) continue; 17 res += dfs(p-1,i,flag||i<d[p]); 18 } 19 return dp[p][pre][flag] = res; 20 } 21 22 int solve(int x){ 23 memset(dp,-1,sizeof(dp)); 24 int cnt = 0; 25 while(x){ 26 d[++cnt] = x%10; 27 x = x/10; 28 } 29 int ans = dfs(cnt,0,0); 30 return ans; 31 } 32 33 int main(){ 34 while(scanf("%d %d",&n,&m) != EOF){ 35 if(n == 0 && m == 0) break; 36 if(n > m) swap(n,m); 37 printf("%d\n",solve(m)-solve(n-1)); 38 } 39 return 0; 40 }
View Code
2.24
HDU 3555
统计区间含 49 的数
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 7 typedef __int64 LL; 8 LL dp[55][55][3],n; 9 int d[105]; 10 11 LL dfs(int p,int s,int limit){ 12 if(p <= 0) return s == 2; 13 if(dp[p][s][limit] != -1) return dp[p][s][limit]; 14 int top = (limit == 1)?d[p]:9; 15 LL ans = 0LL; 16 for(int i = 0;i <= top;i++){ 17 int ns = s; 18 if(s == 0 && i == 4) ns = 1; 19 if(s == 1 && i == 9) ns = 2; 20 if(s == 1 && i != 9) ns = 0; 21 if(s == 1 && i == 4) ns = 1; 22 ans += dfs(p-1,ns,limit && i == top); 23 } 24 return dp[p][s][limit] = ans; 25 } 26 27 void solve(){ 28 memset(dp,-1,sizeof(dp)); 29 int cnt = 0; 30 LL x = n; 31 while(x){ 32 d[++cnt] = x%10; 33 x = x/10; 34 } 35 LL ans = dfs(cnt,0,1); 36 printf("%I64d\n",ans); 37 } 38 39 int main(){ 40 int T; 41 scanf("%d",&T); 42 while(T--){ 43 scanf("%I64d",&n); 44 solve(); 45 } 46 return 0; 47 }
View Code
HDU 3652
含有 13的数,而且能够被13整除
再加一维表示余数
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 7 int n,dp[55][55][15][5],d[105]; 8 9 int dfs(int p,int s,int mod,int limit){ 10 if(p <= 0) return s == 2 && mod == 0; 11 if(dp[p][s][mod][limit] != -1) return dp[p][s][mod][limit]; 12 int top = (limit == 1)? d[p]:9; 13 int ans = 0; 14 for(int i = 0;i <= top;i++){ 15 int ns = s; 16 if(s == 0 && i == 1) ns = 1; 17 if(s == 1 && i != 3) ns = 0; 18 if(s == 1 && i == 1) ns = 1; 19 if(s == 1 && i == 3) ns = 2; 20 ans += dfs(p-1,ns,(mod*10+i)%13,limit && i==top); 21 } 22 return dp[p][s][mod][limit] = ans; 23 } 24 25 void solve(){ 26 memset(dp,-1,sizeof(dp)); 27 int x = n,cnt = 0; 28 while(x){ 29 d[++cnt] = x%10; 30 x = x/10; 31 } 32 int ans = dfs(cnt,0,0,1); 33 printf("%d\n",ans); 34 } 35 36 int main(){ 37 while(scanf("%d",&n) != EOF){ 38 solve(); 39 } 40 return 0; 41 }
View Code
CodeForces 55D
统计区间内能够整除每一位上的数字上的数的个数
记录前 n 位的和,因为太大mod 上2520, 再记录前 n 位的lcm,记录这两个状态
本来这题写的时候,是把limit 作为dp[]的一维的 是像这样dp[位数][sum][lcm][limit]
但是每次要清空,会T
然后看题解说,可以重复利用dp[]的值,所以只需要清空一次
但是我这样写的就不对了
其实我还是不懂这篇里面对那个limit 的注释
http://blog.csdn.net/u012350533/article/details/12362105
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 7 typedef long long LL; 8 9 const int mod = 2520; 10 LL n,m; 11 LL dp[25][2525][55]; 12 int d[55]; 13 int b[5005],rb[5005]; 14 15 int gcd(int x,int y){ 16 return y?gcd(y,x%y):x; 17 } 18 19 int Lcm(int x,int y){ 20 return x/gcd(x,y)*y; 21 } 22 23 LL dfs(int p,int sum,int lcm,int limit){ 24 if(p <= 0) return sum%b[lcm] == 0; 25 if(!limit && dp[p][sum][lcm] != -1) return dp[p][sum][lcm]; 26 int top = (limit == 1)?d[p]:9; 27 LL ans = 0; 28 for(int i = 0;i <= top;i++){ 29 int y; 30 if(i) y = rb[Lcm(b[lcm],i)]; 31 else y = lcm; 32 // printf("i = %d y = %d\n",i,y); 33 ans += dfs(p-1,(sum*10+i)%mod,y,limit && i == top); 34 } 35 if(!limit) return dp[p][sum][lcm] = ans; 36 return ans; 37 } 38 39 LL solve( LL x){ 40 int cnt = 0; 41 42 while(x){ 43 d[++cnt] = x%10; 44 x = x/10; 45 } 46 LL ans = dfs(cnt,0,1,1); 47 // printf("%I64d\n",ans); 48 return ans; 49 } 50 51 int main(){ 52 int T; 53 int cnt = 0; 54 for(int i = 1;i <= mod;i++){ 55 if(mod % i == 0){ 56 b[++cnt] = i; 57 rb[i] = cnt; 58 // printf("i = %d\n",i); 59 } 60 } 61 memset(dp,-1LL,sizeof(dp)); 62 scanf("%d",&T); 63 while(T--){ 64 scanf("%I64d %I64d",&n,&m); 65 LL xiao = solve(n-1); 66 LL da = solve(m); 67 printf("%I64d\n",da-xiao); 68 } 69 return 0; 70 }
View Code
2.25
cf 628f F - Bear and Fair Set
不会建图
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<queue> 6 using namespace std; 7 8 const int maxn = 500005; 9 const int INF = (1 << 30) - 1; 10 11 struct Edge{ 12 int v,next,c; 13 }e[maxn]; 14 15 struct node{ 16 int l,x; 17 }a[maxn]; 18 19 int cmp(node n1,node n2){ 20 return n1.l < n2.l; 21 } 22 23 int st,ed,lev[maxn],first[maxn],now[maxn],ecnt; 24 int n,m; 25 int B,Q; 26 27 void init(int a,int b){ 28 st = a; ed = b; 29 memset(first,-1,sizeof(first)); 30 ecnt = 0; 31 } 32 33 void addedges(int u,int v,int c){ 34 e[ecnt].next = first[u]; 35 e[ecnt].v = v; 36 e[ecnt].c = c; 37 first[u] = ecnt++; 38 39 e[ecnt].next = first[v]; 40 e[ecnt].v = u; 41 e[ecnt].c = 0; 42 first[v] = ecnt++; 43 } 44 45 bool bfs(){ 46 queue<int> q; 47 while(!q.empty()) q.pop(); 48 q.push(st); 49 memset(lev,-1,sizeof(lev)); 50 lev[st] = 0; 51 while(!q.empty()){ 52 int x = q.front();q.pop(); 53 for(int i = first[x];~i;i = e[i].next){ 54 int v = e[i].v; 55 if(lev[v] < 0 && e[i].c > 0){ 56 lev[v] = lev[x] + 1; 57 q.push(v); 58 } 59 } 60 } 61 return lev[ed] != -1; 62 } 63 64 int dfs(int p,int minf){ 65 if(p == ed || minf == 0) return minf; 66 for(int &i = now[p];~i;i = e[i].next){ 67 int v = e[i].v; 68 if(lev[v] == lev[p] + 1 && e[i].c > 0){ 69 int d = dfs(v,min(e[i].c,minf)); 70 if(d > 0){ 71 e[i].c -= d; 72 e[i^1].c += d; 73 return d; 74 } 75 } 76 } 77 return 0; 78 } 79 80 int dinic(){ 81 int max_flow = 0,p1; 82 while(bfs()){ 83 memcpy(now,first,sizeof(first)); 84 while((p1 = dfs(st,INF)) > 0) 85 max_flow += p1; 86 } 87 return max_flow; 88 } 89 90 int main(){ 91 while(scanf("%d %d %d",&n,&B,&Q)!= EOF){ 92 init(0,Q+7); 93 for(int i = 1;i <= Q;i++) scanf("%d %d",&a[i].l,&a[i].x); 94 a[0].l = 0;a[0].x = 0;Q++; 95 a[Q].l = B;a[Q].x = n; 96 sort(a+1,a+Q+1,cmp); 97 for(int i = 1;i <= 5;i++) addedges(st,i,n/5); 98 for(int i = 1;i <= Q;i++){ 99 if(a[i].x < a[i-1].x || (a[i].x != a[i-1].x && a[i].l == a[i-1].l)){ 100 // printf("i = %d\n",i); 101 puts("unfair"); 102 return 0; 103 } 104 addedges(i+5,ed,a[i].x-a[i-1].x); 105 for(int j = 1;j <= 5;j++){ 106 int lb = a[i-1].l/5+(a[i-1].l%5 >= j); 107 int ub = a[i].l/5+(a[i].l%5 >= j); 108 addedges(j,i+5,ub-lb); 109 } 110 } 111 int flow = dinic(); 112 // printf("flow = %d\n",flow); 113 if(flow == n) puts("fair"); 114 else puts("unfair"); 115 } 116 return 0; 117 }
View Code
2.26
滚去学校
2.27
在虚拟机里面装了个Ubuntu,不过好像装挫了T_T
好忧桑......
装了7次...
后来那个continue还是显示不出来.....
狗急跳墙于是用了tab键(是太蠢T_T)
想传张图纪念一下下,,不过发现传不了图T_T
2.28
cf 633c Spy Syndrome 2
不会做,看题解
不会字典树
话说是看的别人的代码
他的每一个字符串哈希了两次,用pair存的
自己试了一下哈希一次的
mod 1e9+7的时候,wa 25
mod 998244353的时候,wa 67
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<map> 6 using namespace std; 7 8 typedef long long LL; 9 const int maxn = 1e5+5; 10 int dp[maxn],pre[maxn],n,m; 11 char s[maxn]; 12 char str[maxn][1005]; 13 int mod[2] = {998244353,1000000007}; 14 int base[2] = {217,31}; 15 LL now[2]; 16 LL hehe[1005]; 17 18 map<pair<LL,LL>,int> h; 19 20 void print(int x){ 21 if(pre[x] == -1) return; 22 int len = strlen(str[pre[x]]); 23 print(x - len); 24 printf("%s ",str[pre[x]]); 25 } 26 27 int main(){ 28 while(scanf("%d",&n) != EOF){ 29 scanf("%s",s); 30 scanf("%d",&m); 31 h.clear(); 32 for(int i =0;i < m;i++){ 33 scanf("%s",str[i]); 34 memset(now,0,sizeof(now)); 35 int len = strlen(str[i]); 36 for(int k = 0;k < 2;k++){ 37 for(int j = 0;j < len;j++){ 38 char c = str[i][j]; 39 if(c >= 'A' && c <= 'Z') c += 'a'-'A'; 40 now[k] = (now[k]*base[k]+c)%mod[k]; 41 } 42 } 43 h[make_pair(now[0],now[1])] = i; 44 } 45 memset(dp,0,sizeof(dp)); 46 memset(pre,-1,sizeof(pre)); 47 dp[0] = 1; 48 for(int i = 0;i < n;i++){ 49 memset(now,0,sizeof(now)); 50 for(int j = i;j >= max(0,i-1000);j--){ 51 for(int k = 0;k < 2;k++) 52 now[k] = (now[k]*base[k]+s[j])%mod[k]; 53 if(dp[j] && h.find(make_pair(now[0],now[1])) != h.end()){ 54 // printf("i = %d j = %d\n",i,j); 55 dp[i+1] = 1; 56 pre[i+1] = h[make_pair(now[0],now[1])]; 57 } 58 } 59 } 60 print(n); 61 printf("\n"); 62 } 63 return 0; 64 }
View Code
转载于:https://www.cnblogs.com/wuyuewoniu/p/5206025.html
寒假第七周 2.22 --- 2.28相关推荐
- 周计划1[7.22~7.28]
周计划1[7.22~7.28] [ ] 复习List 0~4 [ ] List 5~6 [ ] 每天70个百词斩单词 [ ] 每天早上读单词 [ ] 无课日两个小时专业视频 [ ] 课后整理笔记.复习 ...
- 2019年春季第七周 编程总结
一.作业头内容 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 C语言作业评价标准 我在这个课程的目标是 加深和巩固对指针.数组和地址之间的关系的理解:能更准确和灵活的使用指针对数组中元 ...
- 转:《七周成为数据分析师》总结
本文转自: https://blog.csdn.net/weixin_39722361/article/details/79522111 个人公众号:数据路 知乎:无小意. 百日计划第一周总结 1. ...
- 20145324 《信息安全系统设计基础》第七周学习总结
20145324 <信息安全系统设计基础>第七周学习总结 教材学习内容总结 存储器系统是一个具有不同容量.成本和访问时间的存储设备的层次结构 随机访问存储器(两类) 1.静态RAM SRA ...
- 2019春第七周作业
这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 要求我们掌握指针,可以更好的运用它 我在这个课程的目标是 学懂C语言,会编程一些简单的小应用 这个作业在那个具体方面帮助我实现目标 这 ...
- 天善磨剑之作,七周成为数据分析师秦路主讲
章节1: 如何七周成为数据分析师 课时1:为什么需要七周 课时2:七周应该怎么学 章节2: 第一周:数据分析思维 课时3:为什么思维重要 课时4:数据分析的三种核心思维(结构化) ...
- 《七周数据分析师》总结
<七周数据分析师>总结 第一周:数据分析思维 1.核心数据分析思维 结构化 公式化 业务化 2.数据分析思维七大技巧 象限法 多维法 假设法 指数法 80/20法则(帕累托法则) 对比法 ...
- 20159313网络攻击与防范第七周学习总结
第七章Windows操作系统安全攻防总结 1.Windows操作系统的基本结构 分为运行于处理器特权模式的操作系统内核,以及运行在处理器非特权模式的用户空间代码.采用宏内核模式来进行构架,这使得任意的 ...
- “Hello World!“”团队第七周召开的第三次会议
今天是我们团队"Hello World!"团队第七周召开的第三次会议.博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七. ...
- “Hello World!”团队第七周召开的第五次会议
今天是我们团队"Hello World!"团队第七周召开的第五次会议.博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七. ...
最新文章
- 动态划分VLAN的方法中不包括(23)。【答案】C
- mysql 数据库 xtrabackup (完全备份恢复,恢复后重启失败总结)
- 谁是创业板的支柱?兼驳《上海证券报》
- Flex中你最应该知道的10点
- Centos7.0安装tensorflow
- GDCM:将文件封装在RawData中的测试程序
- 爬虫的步骤解析内容xpath介绍_爬虫入门到精通-网页的解析(xpath)
- 实时数仓入门训练营:Hologres性能调优实践
- CakePHP 中文手册
- 用html做简易计步器,HTML5 运动计步器
- PHP移动互联网开发(1)——环境搭建及配置
- 有关USGS下载landsat 8影像的方法
- HDL语言三种描述方式--结构化描述方式、数据流描述方式、行为级描述方式
- GOT-10k: A Large High-Diversity Benchmark forGeneric Object Tracking in the Wild(论文翻译)
- 学习记录3——PMSM数学建模——simulink内数学模型搭建以及仿真
- 驭势吴甘沙:我的根本利益|Xtecher人物特稿
- 当前的安全设置计算机面临风险,win7系统IE8提示“当前安全设置会使计算机有风险”的解决方法...
- mysql科学计数法问题
- GEO数据挖掘全流程分析
- will not use cuDNN kernels since it doesn‘t meet the criteria
热门文章
- 学习python3(一)
- TZOJ 4839 麦森数(模拟快速幂)
- pytest-Mark数据驱动
- 「HNOI 2015」实验比较
- MySQL基础实战篇
- bzoj千题计划315:bzoj3172: [Tjoi2013]单词(AC自动机)
- solr(六): 集群
- IDEA用maven创建springMVC项目和配置
- Codeforces Round #381 (Div. 2) D. Alyona and a tree 树上二分+前缀和思想
- Android File存储