CF798 C. Mike and gcd problem


 1 /*
 2  CF798 C. Mike and gcd problem
 3  http://codeforces.com/contest/798/problem/C
 4  數論 貪心
 5  題意:如果一個數列的gcd值大於1,則稱之為美麗數列
 6     給出數列a,可以將a_i 和 a_(i+1)換為其差和其和
 7     如果可以變為美麗數列,輸出YES並輸出最少的變換次數
 8     否則輸出NO
 9  思路:
10     如果變換a b
11     a b -> a-b a+b -> -2b 2a
12     因此變換兩個可以把a b乘以2
13     而若a b都是奇數,只需變換一次
14     所以每次先找出相鄰是奇數的情況ans++
15     然后找相鄰是奇偶的情況ans+=2
16  然而
17     比賽的時候居然把ans=gcd(ans,num[i]) 寫成了ans=gcd(ans,i)
18     這居然還過了40組數據,也是醉了,雪崩!
19  */
20 
21 #include <cstdio>
22 #include <algorithm>
23 #include <cstring>
24 #include <cmath>
25 #include <vector>
26 #include <queue>
27 #include <iostream>
28 #include <map>
29 #include <set>
30 //#define test
31 using namespace std;
32 const int Nmax=1e6+7;
33 int n;
34 long long num[Nmax];
35 long long gcd(long long a,long long b)
36 {
37     if(b==0)
38         return abs(a);
39     return gcd(b,a%b);
40 }
41 int main()
42 {
43     #ifdef test
44     #endif
45     scanf("%d",&n);
46     for(int i=1;i<=n;i++)
47         scanf("%I64d",&num[i]);
48     long long ans=0LL;//初始化一定要看仔細
49     for(int i=1;i<=n;i++)
50     {
51         ans=gcd(ans,num[i]);//num[i]一定不要寫成i!!!!!
52     }
53     if(ans>1)
54     {
55         printf("YES\n0\n");
56         return 0;
57     }
58     ans=0LL;
59     for(int i=1;i<n;i++)
60     {
61         if((num[i]&1) && (num[i+1]&1))
62         {
63             ans++;
64             num[i]=2;
65             num[i+1]=2;
66         }
67     }
68     for(int i=1;i<=n;i++)
69     {
70         if(num[i]&1)
71         {
72             ans+=2;
73         }
74     }
75     printf("YES\n%I64d\n",ans);
76     return 0;
77 }

 


免責聲明!

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



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