zoukankan      html  css  js  c++  java
  • 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
    ",(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
  • 相关阅读:
    一种C#读写二进制文件的通用方法
    关于POP3协议的一点资料
    关于看图工具的几点想法
    在WPF程序中将控件所呈现的内容保存成图像
    Nuget挂了的解决方法
    VisualStudio 2012中的单元测试
    在Andorid平板上体验Windows8的猜想
    创建自己的awaitable类型
    【转载】:最佳注释
    百度云盘试用
  • 原文地址:https://www.cnblogs.com/hzoi-kx/p/11619693.html
Copyright © 2011-2022 走看看