CF633A
Posted pedestrian6
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF633A相关的知识,希望对你有一定的参考价值。
题意: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的主要内容,如果未能解决你的问题,请参考以下文章