Problem:
B: イカったー / SNS
問題文
AOR イカちゃんは最近少し機嫌が悪い。
どうやら、”イカったー”のフォロー数とフォロワー数の比が気に入らないようだ
。現在、AOR イカちゃんのフォロー数は $A$ 人、フォロワー数は $B$ 人であり、比は $A:B$ である。
そこで、AOR イカちゃんはフォロー数とフォロワー数の比が気に入った整数比になるように、
フォロー数
を増減させることにした。
なお気に入った整数比とは、比に含まれるどちらの値も $1$ 以上 $N$ 以下の整数となるように表せる比である。
しかし、AOR イカちゃんはできるだけフォロー数を変更したくないので、変更前との差の絶対値をできるだけ小さくしたい。
AOR イカちゃんの機嫌を良くするために、少なくともフォロー数をいくつ変更する必要があるかを求めるプログラムを作成せよ。
入力
$A \ B \ N$
入力の制約
$1 \le A, \ B \le 10^{12}$
$1 \leq N \leq 100 $
出力
気に入った整数比にできる、$A$ の変化量の絶対値の最小値を出力せよ。
サンプル
サンプル入力1
19 30 3
サンプル出力1
1
サンプル入力2
3 7 7
サンプル出力2
0
サンプル入力3
3 7 1
サンプル出力3
4
サンプル入力4
102 30 3
サンプル出力4
12
フォローを $12$ 人減らすことで $90:30 \ (=3:1)$ になり、比の大きい方の数字が $3$ 以下となります。
このとき、変化量は $12$ です。
サンプル入力5
3 4 2
サンプル出力5
1
一人フォローを外すと $2:4 \ (=1:2)$ に、フォローすると $4:4 \ (=1:1)$ になり、どちらも増減の絶対値は $1$ でそれが答えです。
サンプル入力6
1 100 2
サンプル出力6
49
最低でも $1$ 人はフォローしていなければいけない事に注意してください。

Submitted solutions:

code_snippet: #include <bits/stdc++.h>
using namespace std;

long long cl(long long a,long long b,long long n){
  long long na=a+(b-a%b);
  if(na/b>n){
    na=n*b;
    return abs(a-na);
  }else{
    long long na2=a-a%b;
    if(na2==0) return abs(a-na);
    return min(abs(a-na),abs(a-na2));
  }
}


int main(){
  long long a,b,n;
  long long ans = 1e12;
  cin>>a>>b>>n;
  for(long long i=1;i*i<=b;i++){
    if(b%i) continue;
    if(b/i<=n){
      long long  c=cl(a,i,n);
      if(c<ans) ans=c;
    }
    if(b/(b/i)<=n){ 
      long long d=cl(a,b/i,n);
      if(d<ans) ans=d;
    }
  }
  cout<<ans<<endl;

  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1156
final_rank: 1

code_snippet: #include <bits/stdc++.h>
using namespace std;

long long cl(int a,int b,int n){
  long long na=a+(b-a%b);
  if(na/b>n){
    na=n*b;
    return abs(a-na);
  }else{
    long long na2=a-a%b;
    if(na2 == 0) na2 = 1e12;
    return min(abs(a-na),abs(a-na2));
  }
}


int main(){
  long long a,b,n;
  long long ans = 1e12;
  cin>>a>>b>>n;
  for(long long i=1;i*i<=b;i++){
    if(b%i) continue;
    if(b/i<=n){
      long long  c=cl(a,i,n);
      if(c<ans) ans=c;
    }
    if(b/(b/i)<=n){ 
      long long d=cl(a,b/i,n);
      if(d<ans) ans=d;
    }
  }
  cout<<ans<<endl;

  return 0;
}
accuracy: 0.15789473684210525
time_ms: 10
memory_kb: 1160
final_rank: 4

code_snippet: #include <bits/stdc++.h>


using namespace std;

struct cww{cww(){ios::sync_with_stdio(false);cin.tie(0);}}init;

typedef long long LL;
#define fin "\n"
void chmin(LL &a,LL b){a=min(a,b);}
LL f(LL a,LL b){return (a+b-1)/b;}
int main(){
    LL A,B,N;
    cin>>A>>B>>N;
    LL res=1e15;
    for(LL i=1;i<=1000000;i++)
        if(B%i==0){
            {
                LL m=i;
                LL b=B/m;
                if(B/m<=N)
                    for(LL a=1;a<=N;a++)
                        chmin(res,abs(a*m-A));
                    
                
            }
            {
                LL m=B/i;
                LL b=B/m;
                if(B/m<=N)
                    for(LL a=1;a<=N;a++)
                        chmin(res,abs(a*m-A));
                    
            }
        }
    cout<<res<<fin;

    return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 3208
final_rank: 3

code_snippet: #include <bits/stdc++.h>

using namespace std;

typedef long long int64;
const int64 INF = 1LL << 58;

int main()
{
  int64 A, B, N;
  cin >> A >> B >> N;

  vector< int64 > prime;
  for(int64 i = 1; i * i <= B; i++) {
    if(B % i == 0) {
      prime.push_back(i);
      if(i != B / i) prime.push_back(B / i);
    }
  }



  int64 ret = INF;
  for(int64 k : prime) {
    if(B / k > N) continue;
    int64 prev = A / k * k;
    int64 next = (A + k - 1) / k * k;
    int64 gcd1 = __gcd(prev, B);
    int64 gcd2 = __gcd(next, B);
    if(prev > 0 && B / gcd1 <= N && prev / gcd1 <= N) ret = min(ret, llabs(prev - A));
    if(next > 0 && B / gcd2 <= N && next / gcd2 <= N) ret = min(ret, llabs(next - A));
  }
  for(int64 k = B; k / B <= N; k += B) {
    ret = min(ret, llabs(k - A));
  }
  cout << ret << endl;
}
accuracy: 1
time_ms: 10
memory_kb: 3156
final_rank: 2

code_snippet: #include <bits/stdc++.h>


using namespace std;

struct cww{cww(){ios::sync_with_stdio(false);cin.tie(0);}}init;

typedef long long LL;
#define fin "\n"
void chmin(LL &a,LL b){a=min(a,b);}
LL f(LL a,LL b){return (a+b-1)/b;}
int main(){
    LL A,B,N;
    cin>>A>>B>>N;
    LL res=1e15;
    for(LL i=1;i<=1000000;i++)
        if(B%i==0){
            {
                LL m=i;
                LL a=f(A,m);
                LL b=B/m;
                if(a<=N&&b<=N)
                    chmin(res,a*m-A);
                a=A/m;
                if(a<=N&&b<=N&&a>0)
                chmin(res,A-a*m);
            }
            {
                LL m=B/i;
                LL a=f(A,m);
                LL b=B/m;
                if(a<=N&&b<=N)
                    chmin(res,a*m-A);
                a=A/m;
                if(a<=N&&b<=N&&a>0)
                chmin(res,A-a*m);
            }
        }
    cout<<res<<fin;

    return 0;
}
accuracy: 0.15789473684210525
time_ms: 10
memory_kb: 3208
final_rank: 6

code_snippet: #include <bits/stdc++.h>

using namespace std;

typedef long long int64;
const int64 INF = 1LL << 58;

int main()
{
  int64 A, B, N;
  cin >> A >> B >> N;


  vector< int64 > prime;
  for(int64 i = 1; i * i <= B; i++) {
    if(B % i == 0) {
      prime.push_back(i);
      if(i != B / i) prime.push_back(B / i);
    }
  }

  int64 ret = INF;
  for(int64 k : prime) {
    if(B / k > N) continue;
    int64 prev = A / k * k;
    int64 next = (A + k - 1) / k * k;
    if(prev / k > 0 && prev / k <= N) ret = min(ret, llabs(prev - A));
    if(next / k > 0 && next / k <= N) ret = min(ret, llabs(next - A));
  }
  cout << ret << endl;
}
accuracy: 0.15789473684210525
time_ms: 10
memory_kb: 3160
final_rank: 5