csps模拟测试57

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 }
View Code

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\n",(f[(1<<n)-1]%mod+mod)%mod);
34     return 0;
35 }
View Code

 

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 }
View Code
posted on 2019-10-03 14:06  _kx  阅读(308)  评论(19编辑  收藏  举报