标签:div ++ toolbar else title alt 两种 另一个 using
题意:a,b<=100两种面值硬币,求能否拼成c<=10000
其实就是求ax+by=c能否求出a,b都为自然数的一组解,用扩欧求出来任意一组,然后运用公式(x+k*b/gcd(a,b),y-k*a/gcd(a,b)),k取任意整数判断
#include<iostream>
using namespace std;
void Gcd(int a,int b,int &d,int &x,int &y){
if (!b){
d=a; x=1; y=0; return;
}
Gcd(b,a%b,d,y,x); y-=x*(a/b);
}
int main(){
int a,b,c,gcd,x,y; cin>>a>>b>>c;
Gcd(a,b,gcd,x,y);
if (c%gcd!=0){cout<<"No"; return 0;}//肯定不会有整数解
x*=c/gcd; y*=c/gcd;//ax+by=c的解
if (x>=0&&y>=0){cout<<"Yes"; return 0;}
//两个解都不为负
int b1=b/gcd,a1=a/gcd;
if (x>0) swap(x,y),swap(a1,b1);
//将x置为负解
int k=(-x)/b1; if ((-x)%b1!=0) k++;
//求出使x+k*b/gcd(a,b)>=0的最小k
if (y-k*a1<0) cout<<"No";
//此时另一个解y-k*a/gcd(a,b)
else cout<<"Yes";
}
标签:div ++ toolbar else title alt 两种 另一个 using
原文地址:https://www.cnblogs.com/Pedestrian6/p/9118844.html