CodeForces CF #508 Div.2

A. Equality
http://codeforces.com/contest/1038/problem/A

hash,min,没有其他内容了,滴,签到完成

B. Non-Coprime Partition
http://codeforces.com/contest/1038/problem/B

给你一个数n,希望你把它分成两组,满足两组数各自的和的GCD>1。

先看数据规模,45000,基本上是不能超过O(NlogN)的。但是这个题目,怎么看怎么是数学题。我觉得必定有思维上O(1)的解法。

猜测要么在前面取要么在后面取。前面没有特征性,不行。那么我们取n放进第一组,其他所有数放进第二组。尝试几组数据,好像都成立,比赛的时候闭着眼睛往上写就完事了,证明能吃吗?当然,现在是赛后,以下给出证明。

首先,对于1,2,穷举证明无解。当大于等于3时:

对于一个数n>=3(n∈N*),分成上述两组,那么sum1=n,sum2=1+2+…+(n-1)=n*(n-1)/2。

①若n为奇数,那么(n-1)为偶数,sum2=n*((n-1)/2),也就是说GCD(sum1,sum2)>=n>1

②若n为偶数,那么n=2*(n/2)且n/2>1(因为n>2),同时,sum2=(n-1)*(n/2),所以GCD(sum1,sum2)=n/2>1

综上所述,如此分组对任意n>=3(n∈N*)都成立。

#include<iostream>
using namespace std;

int main()
{
    int n;
    cin>>n;
    if(n==1||n==2)cout<<"No"<<endl;
    else
    {
        cout<<"Yes"<<endl;
        cout<<1<<" "<<n<<endl;
        cout<<n-1;
        for(int i=1;i<n;i++)cout<<" "<<i;
        cout<<endl;
    }
}

复杂度为O(N)

C. Gambling
http://codeforces.com/contest/1038/problem/C

博弈题。有两个人,各有一个长度为n的waiting list。每次行动可以选择杀死一个自己list的中的数获得其数值,或者杀死对方list的中的一个数并且不获得任何收益。两人轮流行动,若两人都是理性人,希望(自己的数值-对方的数字)最大,问最终结果如何?

先看数据规模1e5,上限O(NlogN)。首先不难发现,不管选取对方的还是选取自己的,总是会选取list中最大的一个,这一点非常显然。那么无论如何,一个sort总是要的,这个复杂度正好对上,剩下的就要靠灵性做题了。

我们用高中物理中常用的整体法和部分法来分析:首先,两个list中的元素的总和分别是固定的,所以在只选取自己的数的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值