T1 天空龙
大神题,考察多方面知识,例如:快读
附上考试代码,以供后人学习
应某迪要求,我决定多写一点。
正如文化课有知识性失分和非知识性失分一样,OI也同样存在。
但非知识性失分往往比知识性失分更惨。
140分,足以让我屈服。如果这是csps,后果不堪设想。
考后一定要检查:快读,提交语言,freopen删没删。
吸取教训,继续前进吧。
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 using namespace std; 6 inline int read() 7 { 8 int x=0,f=1;char c=getchar(); 9 while(c<'0'||c>'9') {if(c='-') f=-1;c=getchar();} 10 while(c>='0'&&c<='9') x=x*10+c-48,c=getchar(); 11 return x*f; 12 } 13 int main() 14 { 15 int t=read(); 16 while(t--) 17 { 18 int a=read(),b=read(),c=read(),x=read(),y=read(),z=read(),cnt=0; 19 if(x<a&&y<b&&z<c){puts("YES");continue;} 20 if(x>a&&y>b&&z>c){puts("NO");continue;} 21 if(a>x) cnt+=(a-x)/2;else cnt+=(a-x); 22 if(b>y) cnt+=(b-y)/2;else cnt+=(b-y); 23 if(c>z) cnt+=(c-z)/2;else cnt+=(c-z); 24 if(cnt>=0) puts("YES"); 25 else puts("NO"); 26 } 27 return 0; 28 }
T2 巨神兵
大神题,同样考察快读。
显然状压DP。
有向无环图有分层性,这是思考的起点
设f[i][j]表示i点集最后一层状态为j的方案数,直接转移即可,注意:上一层必须与新加的层的每个点都有连边。时间复杂度$O(4^n×m)$
考虑优化,把后面那一维去掉,这样会算重,容斥一下,奇加偶减。
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #define int long long 5 using namespace std; 6 const int mod=1e9+7; 7 int f[1<<17],st[405],ed[405],cnt[20],tot,n,m,num[1<<17],g[1<<17],t[20][20],bin[1<<20]; 8 int p[405],gt[1<<17][20]; 9 signed main() 10 { 11 int ans=0;p[0]=1; 12 scanf("%lld%lld",&n,&m); 13 for(register int i=1;i<=n;i++) bin[1<<i-1]=i; 14 for(register int i=1;i<=m;i++) p[i]=p[i-1]*2%mod; 15 for(register int i=1;i<=m;i++) scanf("%lld%lld",&st[i],&ed[i]),t[st[i]][ed[i]]++; 16 for(register int i=1;i<1<<n;i++) 17 for(register int j=1;j<=n;j++) 18 gt[i][j]=gt[i^(i&-i)][j]+t[bin[i&-i]][j]; 19 for(register int i=1;i<1<<n;i++) f[i]=1,num[i]=num[i^(i&-i)]+1; 20 for(register int i=1;i<1<<n;i++) 21 { 22 int ret=((1<<n)-1)^i;g[0]=1; 23 for(register int k=(ret-1)&ret;k;k=(k-1)&ret) 24 { 25 int st=k^ret; 26 g[st]=g[st^(st&-st)]*(p[gt[i][bin[st&-st]]]-1)%mod; 27 (f[i|st]+=(num[st]&1?1:-1)*f[i]*g[st]%mod)%=mod; 28 } 29 int st=ret; 30 g[st]=g[st^(st&-st)]*(p[gt[i][bin[st&-st]]]-1)%mod; 31 (f[i|st]+=(num[st]&1?1:-1)*f[i]*g[st]%mod)%=mod; 32 } 33 printf("%lld ",(f[(1<<n)-1]%mod+mod)%mod); 34 return 0; 35 }
T3 太阳神
直接反演,再发现一个小规律就好了。
1 #include<cstdio> 2 #include<iostream> 3 #define int long long 4 using namespace std; 5 const int N=100000,mod=1e9+7; 6 short mul[N+5]; 7 char vst[N+5]; 8 int prime[100000+5],tot; 9 int n,ans; 10 inline void pre() 11 { 12 mul[1]=1; 13 for(register int i=2;i<=N;i++) 14 { 15 if(!vst[i]) prime[++tot]=i,mul[i]=-1; 16 for(register int j=1;j<=tot&&prime[j]*i<=N;j++) 17 { 18 vst[i*prime[j]]=1; 19 if(i%prime[j]==0){mul[i*prime[j]]=0;break;} 20 mul[i*prime[j]]=-mul[i]; 21 } 22 } 23 return ; 24 } 25 inline int gg(int x) 26 { 27 int cnt=0; 28 for(register int i=1;i*i*i<=x;i++,cnt++) 29 for(register int j=i+1;i*j*j<x;j++) 30 (cnt+=6*(x/i/j-j)%mod)%=mod; 31 for(register int i=1;i*i<=x;i++) 32 (cnt+=3*(x/i/i-(x/i/i>=i))%mod)%mod; 33 return cnt; 34 } 35 inline void Get() 36 { 37 for(int i=1;i*i<=n;i++) 38 { 39 if(!mul[i]) continue; 40 (ans+=mul[i]*gg(n/i/i)%mod)%=mod; 41 } 42 } 43 signed main() 44 { 45 scanf("%lld",&n); 46 pre();Get(); 47 cout<<(((n%mod*(n%mod))%mod-ans)%mod+mod)%mod<<endl; 48 return 0; 49 }