1. 程式人生 > >Codeforces Round #324 (Div. 2)

Codeforces Round #324 (Div. 2)

相同 force 不同 Go 構造方法 IT code include 哥德巴赫猜想

B.http://codeforces.com/contest/584/problem/B

題意:給出3n個點,每個點有個值a[i](大小為[1,3]),當一個序列中至少存在一個i,滿足a[i]+a[i+n]+a[i+2*n]!=6則該序列滿足條件,求有多少序列滿足條件

分析:組合數學。因為條件為“至少”,所以去求反面,即總排列-沒有一個i滿足條件。將3個點看作一組,對於i,i+n,i+2*n來說全排列為27,而當a[i]+a[i+n]+a[i+2*n]==6時,有7組。那麽對於3n來說得到公式ans=27^n-7^n,用快速冪進行處理即可

技術分享圖片
 1 #include<cstdio>
 2 #include<cstring>
 3
#include<algorithm> 4 #include<cmath> 5 using namespace std; 6 typedef long long ll; 7 const ll mod=1e9+7; 8 9 ll pow_(ll x,ll k) 10 { 11 ll ans=1; 12 while ( k ) 13 { 14 if ( k&1 ) ans=(ans*x)%mod; 15 x=(x*x)%mod; 16 k/=2; 17 } 18 return
ans; 19 } 20 21 int main() 22 { 23 ll n,i,j,k,ans; 24 while ( scanf("%lld",&n)!=EOF ) 25 { 26 ans=((pow_(3,3*n)-pow_(7,n))%mod+mod)%mod; 27 printf("%lld\n",ans); 28 } 29 return 0; 30 }
584B

C.http://codeforces.com/contest/584/problem/C

題意:給定兩個字符串s1,s2,長度為n,先定義函數f(a,b)表示兩個長度相同的字符串a,b對應位置字符不同的個數。現在讓你構造一個字符s3,滿足f(s1,s3)=f(s2,s3)=t。

分析:設left=n-t表示s3與s1,s2有多少個位置的字符相同,構造字符相同的位置時首先考慮s1和s2本身就字符就已經相同的位置(數量記為t_)。

記cnt1,cnt2分別為s1,s2中需要和s3字符相同位置的數量,然後再從頭開始,先構造與s1相同的位置,再構造與s2相同的位置,最後構造與s1,s2都不同的位置(構造方法是初始now=‘a‘,當與s1或者s2相同時,now++,直至與s1,s2對應位置都不相同為止,s3[i]=now)

技術分享圖片
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int maxn=1e5+10;
 6 char s1[maxn],s2[maxn],s3[maxn];
 7 bool vis[maxn];
 8 
 9 int main()
10 {
11     int n,t,i,j,k,x,y,z,t_,cnt1,cnt2,now,left;
12     while ( scanf("%d%d",&n,&t)!=EOF )
13     {
14         scanf("%s%s",s1,s2);
15         memset(vis,false,sizeof(vis));
16         t_=0;
17         left=n-t;
18         for ( i=0;i<n;i++ )
19         {
20             if ( s1[i]==s2[i] ) 
21             {
22                 t_++;
23                 if ( left>0 )
24                 {
25                     vis[i]=true;
26                     s3[i]=s1[i];
27                     left--;    
28                 }
29             }
30         }
31         if ( n-2*t-t_>0 ) 
32         {
33             printf("-1\n");
34             continue;
35         }
36         cnt1=cnt2=left;
37         for ( i=0;i<n;i++ )
38         {
39             if ( !vis[i])
40             {
41                 if ( cnt1!=0 && s1[i]!=s2[i] ) 
42                 {
43                     vis[i]=true;
44                     s3[i]=s1[i];
45                     cnt1--;        
46                 }
47                 else 
48                 {
49                     if ( cnt2!=0 && s1[i]!=s2[i] )
50                     {
51                         vis[i]=true;
52                         s3[i]=s2[i];
53                         cnt2--;    
54                     }
55                     else 
56                     {
57                         now=a;
58                         while ( now==s1[i] || now==s2[i] ) now++;
59                         s3[i]=now;
60                         vis[i]=true;
61                     }
62                 }
63             }    
64         }
65         printf("%s\n",s3);
66     }
67     return 0;
68 }
584C

D.http://codeforces.com/contest/584/problem/D

題意:給出一個奇數,問是否存在(1個/2個/3個)質數,使得這幾個質數之和為這個奇數

分析:思路1:根據哥德巴赫猜想,一個大於2的偶數可以分解成兩個素數. 所有我們將其中的一個奇數定為3,剩下的就是值就變成一個偶數,通過暴力查找

技術分享圖片
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cmath>
 5 using namespace std;
 6 
 7 bool isprime(int x)
 8 {
 9     for ( int i=2;i<=sqrt(x);i++ )
10     {
11         if ( x%i==0 ) return false;
12     }
13     return true;
14 }
15 
16 int main()
17 {
18     int n,i,j,k,ans,cnt,num;
19     while ( scanf("%d",&n)!=EOF )
20     {
21         if ( isprime(n) ) printf("1\n%d\n",n);
22         else {
23             n-=3;
24             printf("3\n3");
25             for ( i=2;i<=n;i++ )
26             {
27                 if ( isprime(i) && isprime(n-i) ) 
28                 {
29                     printf(" %d %d\n",i,n-i);
30                     break;
31                 }
32             }
33         }
34     }
35     return 0;
36 }
584D

思路2:具體見https://blog.csdn.net/aaaaacmer/article/details/49448021 大致就是根據分成幾個數的和+奇偶性來確定最後的值

技術分享圖片
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cmath>
 5 using namespace std;
 6 
 7 bool isprime(int x)
 8 {
 9     for ( int i=2;i<=sqrt(x);i++ )
10     {
11         if ( x%i==0 ) return false;
12     }
13     return true;
14 }
15 
16 int main()
17 {
18     int n,ans,a,b,c,i,j,k;
19     bool flag;
20     while ( scanf("%d",&n)!=EOF )
21     {
22         if ( isprime(n) ) 
23         {
24             printf("1\n%d\n",n);
25             continue;
26         }
27         if ( isprime(n-2) )
28         {
29             printf("2\n2 %d\n",n-2);
30             continue;
31         }
32         if ( isprime(n-4) ) 
33         {
34             printf("3\n2 2 %d\n",n-4);
35             continue;
36         }
37         flag=false;
38         for ( i=n-6;i>=3;i-- )
39         {
40             if ( isprime(i) ) 
41             {
42                 for ( j=n-i-3;j>=3;j-- ) 
43                 {
44                     if ( isprime(j) ) 
45                     {
46                         k=n-i-j;
47                         if ( isprime(k) )
48                         {
49                             flag=true;
50                             printf("3\n%d %d %d\n",k,i,j);
51                             break;    
52                         }
53                     }
54                 }
55                 if ( flag ) break;    
56             }
57         }        
58     }
59     return 0;    
60 }
584D

Codeforces Round #324 (Div. 2)