2017 计蒜之道 复赛 题解
2017-06-12 09:32
267 查看
A. 阿里云秘钥池
反演+数位dp#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<functional> #include<iostream> #include<cmath> #include<cctype> #include<ctime> #include<iomanip> #include<vector> #include<string> #include<queue> #include<stack> #include<map> #include<sstream> #include<complex> using namespace std; #define For(i,n) for(int i=1;i<=n;i++) #define Fork(i,k,n) for(int i=k;i<=n;i++) #define ForkD(i,k,n) for(int i=n;i>=k;i--) #define Rep(i,n) for(int i=0;i<n;i++) #define ForD(i,n) for(int i=n;i;i--) #define RepD(i,n) for(int i=n;i>=0;i--) #define Forp(x) for(int p=pre[x];p;p=next[p]) #define Forpiter(x) for(int &p=iter[x];p;p=next[p]) #define Lson (o<<1) #define Rson ((o<<1)+1) #define MEM(a) memset(a,0,sizeof(a)); #define MEMI(a) memset(a,0x3f,sizeof(a)); #define MEMi(a) memset(a,128,sizeof(a)); #define MEMx(a,b) memset(a,b,sizeof(a)); #define INF (0x3f3f3f3f) #define F (1000000007) #define pb push_back #define mp make_pair #define fi first #define se second #define vi vector<int> #define pi pair<int,int> #define vpi vector<pi > #define SI(a) ((a).size()) #define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans); #define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a <<endl; #define PRi2D(a,n,m) For(i,n) { \ For(j,m-1) cout<<a[i][j]<<' ';\ cout<<a[i][m]<<endl; \ } #pragma comment(linker, "/STACK:102400000,102400000") #define ALL(x) (x).begin(),(x).end() typedef long long ll; typedef long double ld; typedef unsigned long long ull; int read() { int x=0,f=1; char ch=getchar(); while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();} while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();} return x*f; } #define MAXN (123456) int p[MAXN],tot; bool b[MAXN]={0}; ll mul[MAXN]; void make_prime(int n) { tot=0; mul[1]=1; Fork(i,2,n) { if (!b[i]) p[++tot]=i,mul[i]=-1; For(j,tot) { if (i*p[j]>n) break; b[i*p[j]]=1; mul[i*p[j]]=-mul[i]; if (i%p[j]==0) { mul[i*p[j]]=0; break; } } } } #undef MAXN #define MAXN (80) #define MAXL (100010) ll f[2][MAXL][2]; ll g[MAXL]; ll len,c[MAXL]; int gcd(int a,int b){if (!b)return a;return gcd(b,a%b);} ll calc(ll n,int p) { len=0; if (!n) return 0; while(n) c[++len]=n%p,n/=p; For(i,len/2) swap(c[i],c[len-i+1]); Rep(j,p) Rep(l,2) f[1][j][l]=f[0][j][l]=0; f[1][c[1]][0]=1; For(j,c[1]-1) f[1][j][1]=1; int nx=0,no=1; For(i,len-1) { For(j,p-1) g[j]=0; For(j,p-1) { for(int l=j;l<p;l+=j) g[j]+=f[no][l][1]; } Rep(j,p) Rep(l,2) f[nx][j][l]=0; f[nx][c[i+1]][0]+=(c[i+1]!=0)*f[no][c[i]][0]*(gcd(c[i],c[i+1])==1); For(j,c[i+1]-1) { f[nx][j][1]+=f[no][c[i]][0]*(gcd(c[i],j)==1); } For(d,p-1) // 枚举 转移后 { for(int k=d;k<p;k+=d) f[nx][k][1]+=g[d]*mul[d]; } For(j,p-1) f[nx][j][1]++; swap(no,nx); } ll ans=0; For(j,p-1) Rep(l,2) ans+=f[no][j][l]; return ans; } int main() { // freopen("a.in","r",stdin); // freopen(".out","w",stdout); int T=read(); make_prime(123451); while(T--) { ll l,r; scanf("%lld%lld\n",&l,&r); int p=read(); printf("%lld\n",calc(r,p)-calc(l-1,p)); } return 0; }
B. Windows 画图
送分#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<functional> #include<iostream> #include<cmath> #include<cctype> #include<ctime> #include<iomanip> #include<vector> #include<string> #include<queue> #include<stack> #include<map> #include<sstream> #include<complex> using namespace std; #define For(i,n) for(int i=1;i<=n;i++) #define Fork(i,k,n) for(int i=k;i<=n;i++) #define ForkD(i,k,n) for(int i=n;i>=k;i--) #define Rep(i,n) for(int i=0;i<n;i++) #define ForD(i,n) for(int i=n;i;i--) #define RepD(i,n) for(int i=n;i>=0;i--) #define Forp(x) for(int p=pre[x];p;p=next[p]) #define Forpiter(x) for(int &p=iter[x];p;p=next[p]) #define Lson (o<<1) #define Rson ((o<<1)+1) #define MEM(a) memset(a,0,sizeof(a)); #define MEMI(a) memset(a,0x3f,sizeof(a)); #define MEMi(a) memset(a,128,sizeof(a)); #define MEMx(a,b) memset(a,b,sizeof(a)); #define INF (0x3f3f3f3f) #define F (1000000007) #define pb push_back #define mp make_pair #define fi first #define se second #define vi vector<int> #define pi pair<int,int> #define vpi vector<pi > #define SI(a) ((a).size()) #define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans); #define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a <<endl; #define PRi2D(a,n,m) For(i,n) { \ For(j,m-1) cout<<a[i][j]<<' ';\ cout<<a[i][m]<<endl; \ } #pragma comment(linker, "/STACK:102400000,102400000") #define ALL(x) (x).begin(),(x).end() typedef long long ll; typedef long double ld; typedef unsigned long long ull; ll mul(ll a,ll b){return (a*b)%F;} ll add(ll a,ll b){return (a+b)%F;} ll sub(ll a,ll b){return ((a-b)%F+F)%F;} void upd(ll &a,ll b){a=(a%F+b%F)%F;} int read() { int x=0,f=1; char ch=getchar(); while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();} while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();} return x*f; } int f[1000][1000]={}; int gcd(int x,int y) {if (!y) return x;return gcd(y,x%y);} int main() { // freopen("B.in","r",stdin); // freopen(".out","w",stdout); int n=read(),m=read(); For(i,n) { int X1=read(),Y1=read(),X2=read(),Y2=read(); int p1=X1,p2=Y1,p3=X2,p4=Y2; int t=gcd(abs(X1-X2),abs(Y1-Y2)); X2=(X2-X1)/t; Y2=(Y2-Y1)/t; int a=X1,b=Y1; while(a<=max(p1,p3)&b<=max(p2,p4)&&a>=min(p1,p3)&&b<=max(p2,p4)) { f[a][b]=i; a-=X2;b-=Y2; } a+=X2,b+=Y2; while(a<=max(p1,p3)&b<=max(p2,p4)&&a>=min(p1,p3)&&b<=max(p2,p4)) { f[a][b]=i; a+=X2;b+=Y2; } } int q=read(); while(q--) { int x=read(),y=read(); printf("%d\n",f[x][y]); } return 0; }
D. 百度地图导航
最短路#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<functional> #include<iostream> #include<cmath> #include<cctype> #include<ctime> #include<iomanip> #include<vector> #include<string> #include<queue> #include<stack> #include<map> #include<sstream> #include<complex> using namespace std; #define For(i,n) for(int i=1;i<=n;i++) #define Fork(i,k,n) for(int i=k;i<=n;i++) #define ForkD(i,k,n) for(int i=n;i>=k;i--) #define Rep(i,n) for(int i=0;i<n;i++) #define ForD(i,n) for(int i=n;i;i--) #define RepD(i,n) for(int i=n;i>=0;i--) #define Forp(x) for(int p=pre[x];p;p=next[p]) #define Forpiter(x) for(int &p=iter[x];p;p=next[p]) #define Lson (o<<1) #define Rson ((o<<1)+1) #define MEM(a) memset(a,0,sizeof(a)); #define MEMI(a) memset(a,0x3f,sizeof(a)); #define MEMi(a) memset(a,128,sizeof(a)); #define MEMx(a,b) memset(a,b,sizeof(a)); #define INF (0x3f3f3f3f) #define F (1000000007) #define pb push_back #define mp make_pair #define fi first #define se second #define vi vector<int> #define pi pair<int,int> #define vpi vector<pi > #define SI(a) ((a).size()) #define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans); #define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a <<endl; #define PRi2D(a,n,m) For(i,n) { \ For(j,m-1) cout<<a[i][j]<<' ';\ cout<<a[i][m]<<endl; \ } #pragma comment(linker, "/STACK:102400000,102400000") #define ALL(x) (x).begin(),(x).end() typedef long long ll; typedef long double ld; typedef unsigned long long ull; ll mul(ll a,ll b){return (a*b)%F;} ll add(ll a,ll b){return (a+b)%F;} ll sub(ll a,ll b){return ((a-b)%F+F)%F;} void upd(ll &a,ll b){a=(a%F+b%F)%F;} int read() { int x=0,f=1; char ch=getchar(); while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();} while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();} return x*f; } #define MAXN (60010) #define MAXM (4000000) class SPFA { public: void mem() { MEM(pre) MEM(edge) MEM(pre) MEM(weight) size=1; } int q[MAXN*100]; ll edge[MAXM],next[MAXM],pre[MAXN],weight[MAXM],size; void addedge(int u,int v,ll w) { edge[++size]=v; weight[size]=w; next[size]=pre[u]; pre[u]=size; } void addedge2(int u,int v,ll w){addedge(u,v,w);addedge(v,u,w);} ll d[MAXN]; bool b[MAXN]; ll spfa(int s,int t) { MEM(b) MEMI(d) b[s]=1; d[s]=0; q[1]=s; int head=1,tail=1; while(head<=tail) { int now=q[head++]; b[now]=0; Forp(now) { int v=edge[p]; if (d[now]+weight[p]<d[v]) { d[v]=d[now]+weight[p]; if (!b[v]) { b[v]=1,q[++tail]=v; } } } } if (d[t]>20000*1e6) return -1; return d[t]; } }S; vi st[MAXN]; int main() { // freopen("d.in","r",stdin); // freopen(".out","w",stdout); int n=read(),m=read(); S.mem(); For(i,m) { int k=read(); while(k--) { int x=read(); S.addedge(x,n+i,0); S.addedge(n+m+i,x,0); } } int m1=read(); For(i,m1) { int u=read(),v=read(),c=read(); S.addedge2(u,v,c); } int m2=read(); For(i,m2) { int u=read(),v=read(),c=read(); S.addedge(n+u,n+m+v,c); S.addedge(n+v,n+m+u,c); } int s=read(),t=read(); printf("%lld\n",S.spfa(s,t)); return 0; }
F. 腾讯消消乐
暴力dp 卡过#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<functional> #include<iostream> #include<cmath> #include<cctype> #include<ctime> #include<iomanip> #include<vector> #include<string> #include<queue> #include<stack> #include<map> #include<sstream> #include<complex> using namespace std; #define For(i,n) for(int i=1;i<=n;i++) #define Fork(i,k,n) for(int i=k;i<=n;i++) #define ForkD(i,k,n) for(int i=n;i>=k;i--) #define Rep(i,n) for(int i=0;i<n;i++) #define ForD(i,n) for(int i=n;i;i--) #define RepD(i,n) for(int i=n;i>=0;i--) #define Forp(x) for(int p=pre[x];p;p=next[p]) #define Forpiter(x) for(int &p=iter[x];p;p=next[p]) #define Lson (o<<1) #define Rson ((o<<1)+1) #define MEM(a) memset(a,0,sizeof(a)); #define MEMI(a) memset(a,0x3f,sizeof(a)); #define MEMi(a) memset(a,128,sizeof(a)); #define MEMx(a,b) memset(a,b,sizeof(a)); #define INF (0x3f3f3f3f) #define F (1000000007) #define pb push_back #define mp make_pair #define fi first #define se second #define vi vector<int> #define pi pair<int,int> #define vpi vector<pi > #define SI(a) ((a).size()) #define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans); #define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a <<endl; #define PRi2D(a,n,m) For(i,n) { \ For(j,m-1) cout<<a[i][j]<<' ';\ cout<<a[i][m]<<endl; \ } #pragma comment(linker, "/STACK:102400000,102400000") #define ALL(x) (x).begin(),(x).end() typedef long long ll; typedef long double ld; typedef unsigned long long ull; ll mul(ll a,ll b){return (a*b)%F;} ll add(ll a,ll b){return (a+b)%F;} ll sub(ll a,ll b){return ((a-b)%F+F)%F;} void upd(ll &a,ll b){a=(a%F+b%F)%F;} int read() { int x=0,f=1; char ch=getchar(); while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();} while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();} return x*f; } #define MAXN (19) ll f[MAXN][1<<18]={0}; int gcd(int a,int b){if(!b)return a;return gcd(b,a%b);} int g[1<<18]={},a[MAXN]; int main() { // freopen("F.in","r",stdin); // freopen(".out","w",stdout); int n=read(),k=read(); int tot=1<<n; Rep(i,n) a[i]=read(); For(i,tot) { Rep(j,n) if ((i>>j)&1) { g[i]=gcd(g[(i)^(1<<j)],a[j]); } } ll ans=0; f[0][0]=1; For(i,n) { Rep(s,tot) { Rep(l,n) if ((s >>l)&1) { int ss=s; Fork(r,l,n-1) if ((s>>r)&1) { ss&=~(1<<r); if (g[s^ss]>=k) { f[i][s]+=f[i-1][ss]; } else break; } } } ans+=(ll)f[i][tot-1]*i%F; ans%=F; } printf("%lld\n",ans); return 0; }
相关文章推荐
- 2017百度之星复赛 hdu 6148 Valley Numer (数位dp)
- HDU6144 Arithmetic of Bomb (2017百度之星程序设计大赛 - 复赛)
- 【TEST】2017百度之星程序设计大赛 - 复赛
- NOIP2017普及组复赛题解
- 2017计蒜之道 复赛 BDF
- [最短路] 2017 计蒜之道 复赛 D. 百度地图导航
- 计蒜之道-2017复赛-腾讯消消乐(状压DP)
- 【数位DP+莫比乌斯函数】2017计蒜之道复赛A[阿里云秘钥池]题解
- [lucas+数位DP] 2017 计蒜之道 复赛 E. 商汤智能机器人
- 2017百度之星复赛1001 Arithmetic of Bomb
- Hdu6144 Arithmetic of Bomb(2017百度之星程序设计大赛 - 复赛)
- 2017 计蒜之道 复赛 E 商汤智能机器人 lucas定理
- NOIP2017普及组复赛 T1
- [数位DP 莫比乌斯反演] 2017 计蒜之道 复赛 A. 阿里云秘钥池
- NOIP2017普及组复赛 总结
- Noip2017复赛游记(爆炸记)
- 2017百度之星复赛:1003. Pokémon GO(递推)
- Hdu6146 Pokémon GO(2017百度之星程序设计大赛 - 复赛)
- 2017 计蒜客复赛 D.百度地图导航
- [数位DP Lucas定理] 2017 计蒜之道 复赛 E. 商汤智能机器人