A - Multiple Array
時間制限 : 2sec / メモリ制限 : 256MB
配点 : 300 点
問題文
N 項からなる数列 A1,…,AN があり、N 個のボタンがあります。 i(1≦i≦N) 個目のボタンを押すと、数列 A の 1 項目から i 項目までの値が 1 ずつ増加します。
数列 B1,…,BN が与えられます。高橋君は、これらのボタンを何回か押して、すべての i に対し、Ai が Bi の倍数になるようにします。
高橋君がボタンを押す回数の最小値を求めてください。
制約
- 入力はすべて整数である。
- 1≦N≦105
- 0≦Ai≦109(1≦i≦N)
- 1≦Bi≦109(1≦i≦N)
入力
入力は以下の形式で標準入力から与えられる。
N A1 B1 : AN BN
出力
高橋君がボタンを押す回数の最小値を表す整数を出力せよ。
入力例 1
Copy
3 3 5 2 7 9 4
出力例 1
Copy
7
1 つめのボタンを 2 回、2 つめのボタンを 2 回、3 つめのボタンを 3 回押せばよいです。
入力例 2
Copy
7 3 1 4 1 5 9 2 6 5 3 5 8 9 7
出力例 2
Copy
22
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int n,m,x;
const int maxn = 1e5+10;
long long gcd(long long a, long long b){
return a == 0 ? b : gcd(b % a, a);
}
long long a[maxn],b[maxn];
int main(){
long long i,j,k;
long long ans;
long long now;
long long comm;
while(~scanf("%d",&n)){
ans = 0;
now = 0;
for(i=1;i<=n;i++){
scanf("%lld%lld",&a[i],&b[i]);
}
for(i=n;i>=1;i--){
a[i] += ans;
for(j=a[i]/b[i];;j++){
if(j*b[i]>=a[i]){
break;
}
}
comm = j*b[i] - a[i];
ans += comm;
}
printf("%lld\n",ans);
}
}