#include<bits/stdc++.h> using namespace std; long long ob[30]; map<pair<long long,int>,long long>wyniki; long long policz(long long n,long long h,int ile){ if(h==0||n==0){ return 0; } if(n<h){ swap(n,h); } if(wyniki.count({n,h})!=0){ return wyniki[{n,h}]; } long long last=ile; while(ob[last]>h){ last--; } long long a; long long wyn=(n/ob[last])*(h/ob[last]); a=policz(n%ob[last],h,last);wyniki[{max(n%ob[last],h),min(n%ob[last],h)}]=a;wyn+=a; a=policz(h%ob[last],(n-(n%ob[last])),last);wyniki[{max(h%ob[last],(n/ob[last])*ob[last]),min(h%ob[last],(n/ob[last])*ob[last])}]=a;wyn+=a; wyniki[{n,h}]=wyn; return wyn; } int main(){ long long n,h;int ile; cin>>n>>h>>ile; for(int i=0;i<ile;i++){ cin>>ob[i]; } sort(ob,ob+ile); if(n%ob[0]!=0||h%ob[0]!=0){ cout<<-1;return 0; } cout<<policz(n,h,ile-1); /*for(auto e:wyniki){ cout<<e.first.first<<" "<<e.first.second<<" "<<e.second<<"\n"; }*/ return 0;}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | #include<bits/stdc++.h> using namespace std; long long ob[30]; map<pair<long long,int>,long long>wyniki; long long policz(long long n,long long h,int ile){ if(h==0||n==0){ return 0; } if(n<h){ swap(n,h); } if(wyniki.count({n,h})!=0){ return wyniki[{n,h}]; } long long last=ile; while(ob[last]>h){ last--; } long long a; long long wyn=(n/ob[last])*(h/ob[last]); a=policz(n%ob[last],h,last);wyniki[{max(n%ob[last],h),min(n%ob[last],h)}]=a;wyn+=a; a=policz(h%ob[last],(n-(n%ob[last])),last);wyniki[{max(h%ob[last],(n/ob[last])*ob[last]),min(h%ob[last],(n/ob[last])*ob[last])}]=a;wyn+=a; wyniki[{n,h}]=wyn; return wyn; } int main(){ long long n,h;int ile; cin>>n>>h>>ile; for(int i=0;i<ile;i++){ cin>>ob[i]; } sort(ob,ob+ile); if(n%ob[0]!=0||h%ob[0]!=0){ cout<<-1;return 0; } cout<<policz(n,h,ile-1); /*for(auto e:wyniki){ cout<<e.first.first<<" "<<e.first.second<<" "<<e.second<<"\n"; }*/ return 0;} |