Codeforces Round #451 (Div. 2) A-B
A:
int main() { int n; cin>>n; if(n==0) cout<<"0"<<endl; else { vector<int>Q; Q.clear(); int x=n; int sum=0; while(x) { Q.push_back(x%10); x/=10; } int len=Q.size(); if(Q[len-1]==0) cout<<x<<endl; else { int z=10-Q[0]; if(z>Q[0]) { printf("%d\n",n-Q[0]); } else printf("%d\n",n+z); } } return 0; }
123
B:
Vasya has n burles. One bottle of Ber-Cola costs a burles and one Bars bar costs b burles. He can buy any non-negative integer number of bottles of Ber-Cola and any non-negative integer number of Bars bars.
Find out if it's possible to buy some amount of bottles of Ber-Cola and Bars bars and spend exactly n burles.
In other words, you should find two non-negative integers x and y such that Vasya can buy x bottles of Ber-Cola and y Bars bars and x·a + y·b = n or tell that it's impossible.
First line contains single integer n (1 ≤ n ≤ 10 000 000) — amount of money, that Vasya has.
Second line contains single integer a (1 ≤ a ≤ 10 000 000) — cost of one bottle of Ber-Cola.
Third line contains single integer b (1 ≤ b ≤ 10 000 000) — cost of one Bars bar.
If Vasya can't buy Bars and Ber-Cola in such a way to spend exactly n burles print «NO» (without quotes).
Otherwise in first line print «YES» (without quotes). In second line print two non-negative integers x and y — number of bottles of Ber-Cola and number of Bars bars Vasya should buy in order to spend exactly n burles, i.e. x·a + y·b = n. If there are multiple answers print any of them.
Any of numbers x and y can be equal 0.
7 2 3
YES 2 1
100 25 10
YES 0 10
15 4 8
NO
9960594 2551 2557
YES 1951 1949
In first example Vasya can buy two bottles of Ber-Cola and one Bars bar. He will spend exactly 2·2 + 1·3 = 7 burles.
In second example Vasya can spend exactly n burles multiple ways:
- buy two bottles of Ber-Cola and five Bars bars;
- buy four bottles of Ber-Cola and don't buy Bars bars;
- don't buy Ber-Cola and buy 10 Bars bars.
In third example it's impossible to but Ber-Cola and Bars bars in order to spend exactly n burles.
扩展欧几里得: 求ax+by=z;
注意要非负数解
#include<iostream> #include<cstring> #include<cstdio> #include<malloc.h> using namespace std; typedef long long ll; inline ll exgcd(ll a,ll b,ll &x,ll &y){if(!b){x=1;y=0;return a;}ll ans=exgcd(b,a%b,x,y);ll temp=x;x=y;y=temp-a/b*y;return ans;} int main() { ll a,b,x,y,c; cin>>c>>a>>b; ll eg=exgcd(a,b,x,y); if(c%eg) cout<<"NO"<<endl; else { x=x*c/eg; x=(x%(b/eg)+b/eg)%(b/eg); y=(c-x*a)/b; if(x<0|y<0) cout<<"NO"<<endl; else { cout<<"YES"<<endl; cout<<x<<" "<<y<<endl; } } return 0; }