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
原创粉丝点击