問題
①数字のペアA,Bが与えられる。
このとき、0以上のp、qに対し、A*p+B*qで数が生成できる。
②また、新たな数字Xが与えられる。
このとき、A,Bで表わせる全てのペアが、X,Yでも表わせるような
Yの場合の数を求める。ただしYが無限になる場合はー1を返す。
解き方
X,YにてA,Bが表わすことができれば、
A,Bで現すことのできる全ての数はX,Yで現すことができる。
Yのとりうる数は1~max(A,B) (Xを除く)なので、
全てのYに対してX,YがA,Bで表わせるかを判定する。
A=X*p+Y*q
q=1として、
pが0からX*pがAになるまで増やしていき、
Yで割ることができるか判定する。
q=0の場合も調べるため、AがXで割り切れるかも判定する。
全て数学的解法に頼らず、全探索との組み合わせで落とし所を探る。
コード
class KingXNewCurrency {
public:
bool f(int num,int x,int y){
if(num%x==0)return true;
for(int i=0;x*i<=num;i++)if((num-x*i)%y==0)return true;
return false;
}
int howMany(int A, int B, int X) {
if(A%X==0 && B%X==0)return -1;
int ans=0;
for(int n=1;n<=max(A,B);n++)if(X!=n && f(A,X,n) && f(B,X,n))ans++;
return ans;
}
};
①数字のペアA,Bが与えられる。
このとき、0以上のp、qに対し、A*p+B*qで数が生成できる。
②また、新たな数字Xが与えられる。
このとき、A,Bで表わせる全てのペアが、X,Yでも表わせるような
Yの場合の数を求める。ただしYが無限になる場合はー1を返す。
解き方
X,YにてA,Bが表わすことができれば、
A,Bで現すことのできる全ての数はX,Yで現すことができる。
Yのとりうる数は1~max(A,B) (Xを除く)なので、
全てのYに対してX,YがA,Bで表わせるかを判定する。
A=X*p+Y*q
q=1として、
pが0からX*pがAになるまで増やしていき、
Yで割ることができるか判定する。
q=0の場合も調べるため、AがXで割り切れるかも判定する。
全て数学的解法に頼らず、全探索との組み合わせで落とし所を探る。
コード
class KingXNewCurrency {
public:
bool f(int num,int x,int y){
if(num%x==0)return true;
for(int i=0;x*i<=num;i++)if((num-x*i)%y==0)return true;
return false;
}
int howMany(int A, int B, int X) {
if(A%X==0 && B%X==0)return -1;
int ans=0;
for(int n=1;n<=max(A,B);n++)if(X!=n && f(A,X,n) && f(B,X,n))ans++;
return ans;
}
};