#include<cstdio>#include<cctype>#define rr registerusingnamespace std;constint N=1011;bool flag;struct node{int y,next;}e[N<<2];int n,k,xx[N],yy[N],ls[N],f[N];inlinesignediut(){
rr int ans=0; rr char c=getchar();while(!isdigit(c)) c=getchar();while(isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans;}inlinevoidadd(int x,int y){
e[++k]=(node){y,ls[x]},ls[x]=k,
e[++k]=(node){x,ls[y]},ls[y]=k;}inlineboolpd(int lx,int rx,int ly,int ry){return lx<rx&&rx<ly&&ly<ry;}inlinevoiddfs(int x){for(rr int i=ls[x];i;i=e[i].next)if(f[e[i].y]==2) f[e[i].y]=f[x]^1,dfs(e[i].y);}signedmain(){for(rr int T=iut();T;--T){iut(),n=iut(),k=1,flag=0;for(rr int i=1;i<=n;++i){
xx[i]=iut(),yy[i]=iut(),f[i]=2,ls[i]=0;if(xx[i]>yy[i]) xx[i]^=yy[i],yy[i]^=xx[i],xx[i]^=yy[i];}for(rr int i=1;i<n;++i)for(rr int j=i+1;j<=n;++j)if(pd(xx[i],xx[j],yy[i],yy[j])||pd(xx[j],xx[i],yy[j],yy[i]))add(i,j);for(rr int i=1;i<=n;++i)if(f[i]==2) f[i]=0,dfs(i);for(rr int i=1;i<=n;++i){for(rr int j=ls[i];j;j=e[j].next)if(f[i]==f[e[j].y]){flag=1;break;}if(flag)break;}if(flag)printf("non\n");elseprintf("sane\n");}return0;}
JZOJ 3847 都市环游
代码(dp+矩阵乘法)
#include<cstdio>#include<cctype>#include<cstring>#define rr registerusingnamespace std;constint mod=10086;struct maix{int p[71][71];}A,ANS;struct node{int y,next;}e[5011];int n,lim,f[71][71],m,mx,beg[71],ls[71],ans;inlinesignediut(){
rr int ans=0; rr char c=getchar();while(!isdigit(c)) c=getchar();while(isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans;}inlinevoidMO(int&x,constint y){x=x+y>=mod?x+y-mod:x+y;}inline maix mul(const maix A,const maix B){
rr maix C;memset(C.p,0,sizeof(C.p));for(rr int i=1;i<=n;++i)for(rr int j=1;j<=n;++j)for(rr int k=1;k<=n;++k)MO(C.p[i][j],A.p[i][k]*B.p[k][j]%mod);return C;}signedmain(){
n=iut(); m=iut(); lim=iut(); f[0][1]=1;for(rr int i=1;i<=n;++i) beg[i]=iut(),A.p[i][i]=1;for(rr int i=1;i<=n;++i) mx=mx>beg[i]?mx:beg[i],ANS.p[i][i]=1;for(rr int i=1;i<=m;++i){
rr int x=iut(),y=iut();
e[i]=(node){y,ls[x]},ls[x]=i;++A.p[x][y];}for(rr int i=0;i<mx;++i){for(rr int j=1;j<=n;++j) f[i+1][j]=f[i][j];for(rr int j=1;j<=n;++j)if(f[i][j])for(rr int p=ls[j];p;p=e[p].next)if(beg[e[p].y]<i+2)MO(f[i+1][e[p].y],f[i][j]);}if(lim<=mx)return!printf("%d",f[lim][n]);for(rr int y=lim-mx;y;y>>=1,A=mul(A,A))if(y&1) ANS=mul(ANS,A);for(rr int i=1;i<=n;++i)MO(ans,f[mx][i]*ANS.p[i][n]%mod);return!printf("%d",ans);}
JZOJ 3850 Fibonacci进制
代码(搜索)
#include<cstdio>#define rr registerusingnamespace std;bool v[81];longlong s,ans,n,sum[81],f[81],one[81],las;inlinevoiddfs(longlong n,int dep){if(!n){for(rr int i=1;i<=s;++i)if(v[i])++ans;return;}--n,ans+=dep;
rr int ii;for(ii=1;ii<73;++ii)if(sum[ii]>n){
n-=sum[ii-1];
ans+=one[ii-1]+sum[ii-1]*dep;break;}
v[las-ii+1]=1;dfs(n,dep+1);}signedmain(){scanf("%lld",&n),sum[2]=one[2]=2;
f[1]=f[2]=sum[1]=one[1]=1;
rr int ii; rr longlong now=0;for(rr int i=3;i<73;++i){
f[i]=sum[i-2]+1;
sum[i]=sum[i-1]+f[i];
one[i]=one[i-2]+sum[i-2]+one[i-1]+1;}for(ii=1;ii<73;++ii){if(now+f[ii]*ii>=n) ans+=one[ii-1];else{now+=f[ii]*ii;continue;}break;}
n-=now,las=ii,s=n%ii,v[1]=1,dfs(n/ii,1);return!printf("%lld\n",ans);}