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;
}
}
}