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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM