1. 程式人生 > >2018.9.21 Codeforces Round #511

2018.9.21 Codeforces Round #511

algorithm splay 分解質 dac include sca love ++ lap

只寫了AB,甚至還WA了一次A題,暴露了蒟蒻的本質=。=

感覺考的時候有好多正確或和正解有關的思路,但是就想不出具體的解法或者想的不夠深(長)(怕不是過於鶸)

話說CF的E題怎麽都這麽清奇=。=

A.Little C Loves 3 I

隨便拆一下就好了,大概全場就我一個心太急寫掛了一次TAT

技術分享圖片
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 int main ()
 6 {
 7     long long n; scanf("
%lld",&n); 8 if(n%3==2) printf("%lld 1 2",n-3); 9 else printf("%lld 1 1",n-2); 10 return 0; 11 }
View Code

B.Cover Points

初中數學知識(?)或者隨手推一推,水水(我**就會這倆水題)

技術分享圖片
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 int main ()
 6 {
 7
long long n,m,p,ans=0; 8 scanf("%lld",&n); 9 for(int i=1;i<=n;i++) 10 scanf("%lld%lld",&m,&p),ans=max(m+p,ans); 11 printf("%lld",ans); 12 return 0; 13 }
View Code

C.Enlarge GCD

題目並不難......

然而被這題確實沒做出來,調的時候也調了半天,我好菜啊=。=

首先我們求一個全序列的gcd,然後從每個數中除掉它,剩下的數肯定是互質的,也就是說現在我們要從這些剩下的數中刪掉最少的數使得他們不互質。我們將每個數分解質因數,統計出現次數最多的質因數(出現在一個數裏算是一次),保留下它肯定就是最優的,於是用總數減去出現次數更新答案即可

技術分享圖片
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int N=300005,M=15000005;
 6 int mpr[M],pri[M],cnt[M],num[N];
 7 int n,g,maxx,ans=2e9;
 8 int gcd(int a,int b)
 9 {
10     return b?gcd(b,a%b):a; 
11 }
12 inline int maxi(int a,int b)
13 {
14     return a>b?a:b;
15 }
16 inline int mini(int a,int b)
17 {
18     return a<b?a:b;
19 }
20 int main ()
21 {
22     scanf("%d",&n);
23     for(register int i=1;i<=n;i++)
24     {
25         scanf("%d",&num[i]);
26         g=gcd(g,num[i]),maxx=maxi(maxx,num[i]);
27     }
28     mpr[1]=1; 
29     for(register int i=2,sz=0;i<=maxx;i++)
30     {
31         if(!mpr[i]) pri[++sz]=mpr[i]=i;
32         for(int j=1;j<=sz&&i*pri[j]<=maxx;j++)
33         {
34             mpr[i*pri[j]]=i;
35             if(!(i%pri[j])) break;
36         }
37     }
38     for(register int i=1;i<=n;i++)
39     {
40         num[i]/=g;
41         while(num[i]!=1)
42         {
43             long long tmp=++cnt[mpr[num[i]]];
44             ans=mini(ans,n-tmp),num[i]/=mpr[num[i]];
45         }
46     }
47     if(ans>=n) ans=-1;
48     printf("%d",ans);
49     return 0;
50 }
View Code

D.Little C Loves 3 II

這題毒瘤啊,各種分類海星

比賽的時候怎麽就沒玩玩小數據呢,明明能A的TAT

首先的首先,要考慮$n*m$的奇偶性,不解釋

然後我們可以發現,有些$n*m$是可以填滿且無法被其他的$n*m$表示出來的,它們分別是

$1*6$,$2*4$,$2*5$

所以說我們可以考慮用這些塊填滿棋盤,最後小塊單獨處理

那麽沒什麽可說的,我們開始討論吧=。=

1.$n,m$都為偶數

這種情況只有$(2,2)$填不滿,別的都可以填滿

2.$n,m$都為奇數

這種情況

技術分享圖片
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 long long line[6]={0,1,2,3,2,1};
 6 long long n,m;
 7 int main ()
 8 {
 9     scanf("%lld%lld",&n,&m);
10     if(n>m) swap(n,m);
11     if(n==1) printf("%lld",m-line[m%6]);
12     else if(!(n&1)&&!(m&1)) (n==2&&m==2)?printf("0"):printf("%lld",n*m);
13     else if((n&1)&&(m&1)) printf("%lld",n*m-1);
14     else
15     {
16         if(n&1) swap(n,m);
17         if(n==2&&m==3) printf("4");
18         else if(n==2&&m==7) printf("12");
19         else printf("%lld",n*m);
20     }
21     return 0;
22 } 
View Code

2018.9.21 Codeforces Round #511