T1:
#include <stdio.h> #include <algorithm> #include <cstring> using namespace std; const int maxn=420; typedef long long ll; const int mod=1e9+7; ll g[maxn][maxn],l[maxn],r[maxn]; int n,c; ll f[maxn][maxn]; int main() { // freopen("candy.in","r",stdin); // freopen("candy.out","w",stdout); scanf("%d%d",&n,&c); for(int i=1;i<=n;i++) scanf("%lld",&l[i]); for(int i=1;i<=n;i++) scanf("%lld",&r[i]); for(int i=1;i<=n;i++) for(int j=l[i];j<=r[i];j++) { ll s=1; for(int k=0;k<=c;k++) (g[i][k]+=s)%=mod,(s*=j)%=mod; } f[0][0]=1;//注意初始状态 for(int i=1;i<=n;i++) for(int j=0;j<=c;j++) for(int k=0;k<=j;k++) (f[i][j]+=(f[i-1][j-k]*g[i][k]+mod)%mod)%=mod;//注意是=还是+= printf("%lld",f[n][c]); return 0; }
T2 :
#include <stdio.h> #include <algorithm> #include <cstring> #include <iostream> using namespace std; const int maxn=1010; struct node { int u,v; }ans[maxn]; int main() { freopen("b.in","r",stdin); freopen("b.out","w",stdout); int k; while(cin>>k) { int u=1; int len=0; for(int i=1;i<=k;i<<=1) { if(i>1) ans[++len].u=u,ans[len].v=len+1; if((i&k)&&((i<<1)<=k)) ans[++len].u=len+1,ans[len].v=u,u=len+1; } printf("%d\n",len+1); for(int i=1;i<=len;i++) printf("%d %d\n",ans[i].u,ans[i].v); } return 0; }
T3 :
相关知识点,使用行列式和叉乘球多边形的面积:
T4
#include <stdio.h> #include <algorithm> #include <cstring> using namespace std; const int maxn=1<<17; const int mod=1e9+7; int f[41][maxn+300],g[11][maxn+300]; int x,y,z,n; int main() { freopen("poem.in","r",stdin); freopen("poem.out","w",stdout); scanf("%d%d%d%d",&n,&x,&y,&z); y+=x;z+=y; int maxs=1<<z; //printf("%d %d \n",y,maxs); for(int i=1;i<=10;i++) g[i][maxs]=maxs; for(int s=1;s<maxs;s++)//dp数组按照dp顺序来定义会舒服一点 for(int i=1;i<=10;i++) { g[i][s]=1; for(int k=0;k<z;k++) if((s>>k)&1&&i+k<=z&&!(k<x&&k+i>x)&&!(k<y&&k+i>y)) g[i][s]|=1<<(i+k); if(g[i][s]>maxs)g[i][s]=maxs; } f[0][1]=1; for(int i=0;i<n;i++) for(int s=1;s<=maxs;s++) { if(f[i][s]) { for(int j=1;j<=10;j++) (f[i+1][g[j][s]]+=f[i][s])%=mod; } } printf("%d ",f[n][maxs]%mod); return 0; }
这一题我只能说,状态设计的简直是艺术
原文:https://www.cnblogs.com/ILHYJ/p/13922277.html