zoukankan      html  css  js  c++  java
  • 【推导】Codeforces Round #410 (Div. 2) C. Mike and gcd problem

    如果一开始就满足题意,不用变换。

    否则,如果对一对ai,ai+1用此变换,设新的gcd为d,则有(ai - ai+1)mod d = 0,(ai + ai+1)mod d = 0

    变化一下就是2 ai mod d = 0

    2 ai+1 mod d = 0

    也就是说,用两次变换之后,gcd至少扩大2倍,于是,最优方案就是我们将所有的奇数都变成偶数。

    只需要找出所有奇数段,答案就是sigma([奇数段的长度/2]+(奇数段的长度 mod 2 ==1 ?))。

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    int n;
    ll a[100010];
    int main(){
    //	freopen("c.in","r",stdin);
    	scanf("%d",&n);
    	for(int i=1;i<=n;++i){
    		scanf("%I64d",&a[i]);
    	}
    	int GCD=(int)a[1];
    	for(int i=2;i<=n;++i){
    		GCD=__gcd(GCD,(int)a[i]);
    	}
    	if(GCD!=1){
    		puts("YES
    0");
    		return 0;
    	}
    	int cnt=0,sta;
    	for(int i=1;i<=n;++i){
    		if(a[i]%2ll==1 && (i==1 || a[i-1]%2ll==0)){
    			sta=i;
    		}
    		if(a[i]%2ll==1 && (i==n || a[i+1]%2ll==0)){
    			cnt+=(i-sta+1)/2+((i-sta+1)%2==1 ? 2 : 0);
    		}
    	}
    	printf("YES
    %d
    ",cnt);
    	return 0;
    }
  • 相关阅读:
    lua 根据路径获取文件名
    python中的re模块
    正则表达式中的开头和结尾
    正则表达式匹配多个字符
    正则表达式中匹配单个字符
    正则表达式的作用
    gevent实现协程
    greenlet实现协程
    生成器的使用注意
    生成器实现斐波那契数列
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/6747960.html
Copyright © 2011-2022 走看看