补一补ZZU曾经的招新赛

15 篇文章 0 订阅

E. Kirito and Asuna

描述
kirito为了纪念和Asuna认识的第100天,决定约Asuna出去玩,约会当然要买花了,Kirito不知道Asuna喜欢什么花,但是他知道Asuna有一个爱好,如果两种花的价格是互质的,那么Asuna就会喜欢这些花;如果超过两种的话,那么任意两种花的价格都要互质(若a和b的最大公因数是1,我们认为a和b互质)。Krito当然想买更多种花送给Asuna了,也想让Asuna喜欢他买的这些花,那么他最多能送给Asuna多少种花呢。

输入
第一行为一个数字n,1<n<15,代表有n种花。

第二行为n个数,第i个数为a[i],0~1e9
,每个数代表一种花的价格.

输出
仅一行,代表Kirito最多能送给Asuna多少种花。

样例输入

7
7 6 5 4 3 2 1

输出

5

算法:二进制枚举,本题也可爆搜

#include <iostream>
#include <cstring>
#include <algorithm>
#include <ctime> 
using namespace std;
typedef long long LL;
const int N = 100010;
const int mod=1e9+7;
int a[N]; 
int main()
{
	int n;
	cin>>n;
	for(int i=0;i<n;i++)cin>>a[i];
	int res=1;
	for(int i=1;i<1<<n;i++)
	{
		int t=__builtin_popcount(i);
		if(t==1)continue;
		bool f=0;
		int p=i;
		for(int j=0;j<n;j++)
		{
			if((p>>j&1)==0)continue;
			for(int k=j+1;k<n;k++)
			{
				if((p>>k&1)&&(j!=k))
				{
					if(__gcd(a[j],a[k])!=1)
					{
						f=1;
						break;
					}
				}
			}
			if(f)break;
		}
		if(!f)res=max(res,t);
	}
	cout<<res<<endl;
}

E. MORE SWEET

描述

ZZUACM集训队有n位队员,编号1~n由左至右,站成一排。

教练从左向右发苹果,每a个队员获得一个苹果(a号是第一个得到苹果的),从右往左发香蕉,每b个队员获得一个香蕉,(n-b+1)号是第一个得到香蕉的)。

问题:教练想要知道有多少队员既获得了苹果又获得了香蕉。

输入
输入三个正整数n,a,b。
数据规范:
*1≤n≤1000000000
*1≤a,b≤1000007

输出

输出一个整数,表示有多少队员既获得了苹果又获得了香蕉。

样例

in

8 3 2

out

1

暴力超时

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int main() {
	
	LL n,a,b,x,num=0;
	cin>>n>>a>>b;
	x=n%b+1;
	for(int i=1;i<=n;i++){
		if(i%a==0&&(i-x)%b==0)num++;
		
	}
	if(x%a==0)num++;
	cout<<num<<endl;

}

扩展欧几里得算法

#include <iostream>
#include <cstring>
using namespace std;
#define int long long
int exgcd(int a,int b,int &x,int &y)
{
	if(!b)
	{
		x=1,y=0;
		return a;
	}
	int res=exgcd(b,a%b,y,x);
	y-=a/b*x;
	return res;
}
 
signed main()
{
    int n,a,b,x,y;
    cin>>n>>a>>b;
    n++;
    int d=exgcd(a,b,x,y);
    int modx=b/d,mody=a/d;
    if(n%d)cout<<0<<endl;
    else 
    {
    	x*=n/d;
    	y*=n/d;
    	x=(x%modx+modx)%modx;
    	if(!x)x+=modx;
    	y=(n-a*x)/b;
    	if(y<=0)cout<<0<<endl;
    	else
    	{
    		int t=(y%mody!=0);
    		cout<<y/mody+t<<endl;
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_WAWA鱼_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值