码迷,mamicode.com
首页 > 其他好文 > 详细

CF633A

时间:2018-05-31 21:10:00      阅读:113      评论:0      收藏:0      [点我收藏+]

标签: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";
}

CF633A

标签:div   ++   toolbar   else   title   alt   两种   另一个   using   

原文地址:https://www.cnblogs.com/Pedestrian6/p/9118844.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!