Codeforces Round #235 (Div. 2)
来源:互联网 发布:winrar解压缩软件4.20 编辑:程序博客网 时间:2024/05/21 22:33
C、D
C:
范围在[n-1,(n+1)*2]之间是可以构造出来的,0必须用至少1个1隔开。
code:
#include <algorithm>#include <iostream>#include <string.h>#include <stdlib.h>#include <sstream>#include <stdio.h>#include <string>#include <vector>#include <queue>#include <stack>#include <cmath>#include <list>#include <set>#include <map>using namespace std;#define N 100010#define ALL(x) x.begin(),x.end()#define CLR(x,a) memset(x,a,sizeof(x))typedef long long ll;typedef pair<int,int> PI;const int INF = 0x3fffffff;const int MOD = 1000000007;/*-----------code------------*/int main(){int n,m;scanf("%d%d",&n,&m);if(m<n-1 || m>(n+1)*2){puts("-1");return 0;}m-=n-1;if(m){if(m>=2) printf("11"), m-=2;else printf("1"), m--;}int t=n-1;while(n--){printf("0");if(m){printf("1");m--;}if(t) printf("1"), t--;}if(m){printf("%s",string(m,'1').c_str());}return 0;}
D:
状压dp
dp[i][j] 表示当前选了哪些数字,状态是i,余数是j的方案数。
dp时候两个注意点:
1. 0不能 作为开头
2. 重复数字选取顺序不同其实是一样的,必须把这种情况限制掉。可以给重复数字设定先后顺序。
用lowbit优化下,可以降低2倍的常数。这题有4秒,跑4亿还是有点虚的。但是2亿就不怎么虚了
code:
#include <algorithm>#include <iostream>#include <string.h>#include <stdlib.h>#include <sstream>#include <stdio.h>#include <string>#include <vector>#include <queue>#include <stack>#include <cmath>#include <list>#include <set>#include <map>using namespace std;#define N 100010#define ALL(x) x.begin(),x.end()#define CLR(x,a) memset(x,a,sizeof(x))typedef long long ll;typedef pair<int,int> PI;const int INF = 0x3fffffff;const int MOD = 1000000007;/*-----------code------------*/char num[32];int m,d[1<<18],r[32];ll dp[1<<18][128];inline int low(int &x){return -x&x;}int main(){for(int i=0;i<18;i++) d[1<<i]=i;scanf("%s%d",num,&m);int n=strlen(num);for(int i=0;i<n;i++) num[i]-='0';CLR(r,-1);for(int i=n-1;i>=0;i--){for(int j=i-1;j>=0;j--) if(num[i]==num[j]){r[i]=1<<j;break;}}int M=1<<n;dp[M-1][0]=1;for(int st=M-1;st>0;st--){for(int i=0;i<m;i++){if(dp[st][i]==0) continue;int y=st;for(int x=low(y);y;x=low(y)){y-=x;int j=d[x];if(r[j]!=-1 && !(r[j]&st)) continue;if(st==M-1 && num[j]==0) continue;dp[st^x][(i*10+num[j])%m]+=dp[st][i];}}}printf("%I64d\n",dp[0][0]);return 0;}
0 0
- Codeforces Round #235 (Div. 2)
- Codeforces Round #235 (Div. 2)
- Codeforces Round #235 (Div. 2)
- [Codeforces] Round #235 (Div. 2)
- Codeforces Round #235 (Div. 2)
- Codeforces Round #235 (Div. 2)
- Codeforces Round #235 (Div. 2)
- Codeforces Round #235 (Div. 2) A~D
- Codeforces Round #235 (Div. 2) A
- Codeforces Round #235 (Div. 2) C
- Codeforces Round #235 (Div. 2)__C. Team
- Codeforces Round #235 (Div. 2)C. Team
- Codeforces Round #102 (Div. 2)
- Codeforces Round #103 (Div. 2)
- Codeforces Round #103 (Div. 2)
- Codeforces Round #104 (Div. 2)
- Codeforces Round #105 (Div. 2)
- Codeforces Round #105 (Div. 2)
- 网络131黄宇倩--第二周作业
- 华为机试题---二维数组的转置
- UNIX高级环境编程读书笔记(chapter1-3)
- python进阶四_模块调用
- 华为机试题---随机打印50个随机(4-10长度)的字符串
- Codeforces Round #235 (Div. 2)
- 未分类--Windows API--EnumProcesses
- 未分类--Windows API--OpenProcess
- 001_016 Python 替换字符串中的子串
- UNIX高级环境编程读书笔记(chapter4)
- Java 解析xml文件
- UNIX高级环境编程读书笔记(chapter5)
- UNIX高级环境编程读书笔记(chapter7)
- codeforces round #235 A. Vanya and Cards