1. 程式人生 > >[Codeforces]Codeforces Global Round 1

[Codeforces]Codeforces Global Round 1

ase 但是 否則 const 找規律 ++ ace 使用 gif

A - Parity

題意

給定一個$b$進制數,要求輸出它在十進制下是奇數還是偶數。

分析

花了我略多的時間,首先題目中給的數字範圍很大,不能直接轉化為10進制。

分析性質,發現只有奇數乘奇數還是奇數,其他都是偶數。

對奇數進制和偶數進制分類討論。

偶數進制看最低位的奇偶性,如果是奇數那麽這個數就是奇數,不然是偶數。

奇數進制看每一位上奇數的個數,如果是奇數個奇數就是奇數,不然是偶數。

代碼

技術分享圖片
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N=1e5+1009;
 4 int
read(){ 5 char c;int num,f=1; 6 while(c=getchar(),!isdigit(c))if(c==-)f=-1;num=c-0; 7 while(c=getchar(), isdigit(c))num=num*10+c-0; 8 return f*num; 9 } 10 int n,Base,v[N]; 11 bool f1,f2; 12 int main() 13 { 14 Base=read();n=read(); 15 for(int i=n-1;i>=0;i--)v[i]=read();
16 f1=Base&1;f2=0; 17 if(!f1){ 18 f2=v[0]&1; 19 if(f2)printf("odd\n"); 20 else printf("even\n"); 21 }else{ 22 for(int i=0;i<=n-1;i++) 23 if(v[i]&1) 24 f2=!f2; 25 if(f2)printf("odd\n"); 26 else
printf("even\n"); 27 } 28 return 0; 29 }
View Code

B - Tape

題意

給定一條線段,上面有$n$個點,你有$k$條線段(任意長度)可以使用,求覆蓋所有點的最小線段長度和。

分析

一開始想用DP,秒得方程,但是復雜度是$O(n^2)$,想到用數據結構優化。

後來覺得B題不會這麽難吧,仔細分析性質,每一個線段的兩端肯定是兩個點(顯然)

然後每個點肯定僅由一條線段覆蓋(顯然)

那麽問題就轉化為了在題目中給的$n-1$個間隔中,選擇$n-k$個間隔未被覆蓋,其余的用線段覆蓋。

然後排序一下就可以了。。

代碼

技術分享圖片
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N=5e5+1009;
 4 int read(){
 5     char c;int num,f=1;
 6     while(c=getchar(),!isdigit(c))if(c==-)f=-1;num=c-0;
 7     while(c=getchar(), isdigit(c))num=num*10+c-0;
 8     return f*num;
 9 }
10 int n,m,k,sum;
11 int a[N],dis[N];
12 int main()
13 {
14     n=read();m=read();k=read();
15     for(int i=1;i<=n;i++)a[i]=read();
16     for(int i=1;i<=n;i++)dis[i]=a[i]-a[i-1];
17     sort(dis+2,dis+n+1);
18     for(int i=2;i<n-k+2;i++)
19         sum+=dis[i];
20     printf("%d\n",sum+k);
21     return 0;
22 }
View Code

C - Meaningless Operations

題意

給定$q$個數,要求每個數$a$找到一個$b(1\le b< a)$使得$gcd(a$ $xor$ $b,a$ $and$ $b)$最大。

分析

我們分兩類討論。

第一類:$a$不是$2^k-1$時,這時候我們發現我們只要讓$a$ $and$ $b=0$,$a$ $xor$ $b=2^k-1$就可以了。

重點在第二類:打表找規律,發現如果$a$是質數時,答案為$1$,否則答案為$a$的最大真因子。

我怕$a$很大又是質數的時候可能會超時,用的是Miller-Rabbin算法判斷的質數。

代碼

技術分享圖片
 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 const ll test[109]={2,3,5,7,11,61,24251,13,17,23};
 5 ll read(){
 6     char c;ll num,f=1;
 7     while(c=getchar(),!isdigit(c))if(c==-)f=-1;num=c-0;
 8     while(c=getchar(), isdigit(c))num=num*10+c-0;
 9     return f*num;
10 }
11 ll Pow(ll a,ll p,ll mod){
12     ll ans=1;
13     for(;p;p>>=1,a=1ll*a*a%mod)
14         if(p&1)ans=1ll*ans*a%mod;
15     return ans;
16 }
17 bool check(ll P){
18     if(P==1)return 0;
19     ll k=0,t=P-1;
20     while(!(k&1))k++,t>>=1;
21     for(int i=0;i<10;i++){
22         if(P==test[i])return 1;
23         ll a=Pow(test[i],t,P),nxt;
24         for(int j=1;j<=k;j++){
25             nxt=(1ll*a*a)%P;
26             if(nxt==1&&a!=1&&a!=P-1)return 0;
27             a=nxt;
28         }
29         if(a!=1)return 0;
30     }
31     return 1;
32 }
33 int ct(ll x){
34     ll t=1;int flag=0;
35     while(t<=x){
36         if((x&t)==0)flag=1;
37         t<<=1;
38     }
39     if(flag)return t;
40     else return -1;
41 }
42 int main()
43 {
44     int q=read();
45     for(int i=1;i<=q;i++){
46         ll a=read();
47         ll b=ct(a);
48         if(!(~b)){
49             if(check(a))printf("1\n");
50             else {
51                 for(ll i=2;i<a;i++){
52                     if(a%i==0){
53                         cout<<(a/i)<<endl;
54                         break;
55                     }
56                 }
57             }
58         }else cout<<(b-1)<<endl;
59     }
60     return 0;
61 }
View Code

[Codeforces]Codeforces Global Round 1