sgu-246 Black & White

59 篇文章 1 订阅
15 篇文章 0 订阅
题目大意:

给你一个 2N1 个珠子组成的环形项链,珠子只有黑色和白色两种颜色,输入 2N1 ,要你求出这串项链中最少要有多少个黑色珠子( MAX ),使得对于所有拥有 MAX 个黑色珠子的项链总可以找到一对黑色珠子使得去掉这两个黑色珠子将项链分成两段并且其中总有一段珠子的个数为N。输出这个 MAX

解题思路:

首先我们观察发现, ans<=N ,这是显然的,但是显然是 N
我们考虑构造一个方案使得有K个黑色珠子并且不满足上面的要求,那么 ans=K+1
首先如果第1个放了黑色珠子,那么第 1+(n+1) 个一定得放白色珠子,第 1+(n+1)2 可以放置黑色珠子,意识流之后脑补一下这样构造好像是最大的,那么我们就这么构造了。
我们假设第i个放黑色,那么我们就可以每次隔 n+1 放置一个反色的珠子,比如黑白黑白……..
然后我们发现从i出发最少进行 L=LCM(N+1,2N1N+1 次就会回到i,那么如果i放置黑色,那么这一次轮回一共可以放置 L2 个黑色珠子,然后一共有 2N1L 个轮回,那么 K=2N1LL2 ,所以 ans=K+1=2N1LL2+1

AC代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>

using namespace std;

int n;

int gcd(int a,int b)
{return a%b==0?b:gcd(b,a%b);}

int main()
{
    scanf("%d",&n);
    n=n/2+1;
    int Gcd=gcd(n+1,2*n-1);
    int L=(long long)(n+1)*(2*n-1)/Gcd/(n+1);
    printf("%d",(2*n-1)/L*(L/2)+1);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值