SRM537 DIV2 -Level2

問題

①数字のペア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;
}

};

このエントリーをはてなブックマークに追加