Official
D - Product Calculator Editorial
by
D - Product Calculator Editorial
by
mechanicalpenciI
計算機に \(X\) が表示されているとき、\(A_i\) をかけた後表示される数は次のようになります。
- \((X\times A_i)>10^K-1\) ならば \(1\)
- そうでないならば、\((X\times A_i)\)
これを \(i=1,2,\ldots,K\) の順で行い、最終的に表示されている数を求めれば良いです。
ただし、\((X\times A_i)\) は最大で \((10^{18}-1)^2\). となり、 \(64\) ビット整数型で計算する場合はオーバーフローを起こすため、計算を工夫する必要があります。 例えば、\(Y=10^K-1\) として、\((X\times A_i)>Y\) と \(X> \left\lfloor \frac{Y}{A_i}\right\rfloor\) が同値であることが利用できます。ここで、\(\left\lfloor \frac{Y}{A_i}\right\rfloor\) は \( \frac{Y}{A_i}\) 以下の最大の整数を表します。
証明
つねに $A_i>0$ であることに注意します。 $(X\times A_i)>Y$ ならば、定義より $X>\frac{Y}{A_i}\geq \left\lfloor \frac{Y}{A_i}\right\rfloor$ が成り立ちます。 一方で、$X> \left\lfloor \frac{Y}{A_i}\right\rfloor$ ならば両辺が整数であることから$X-1\geq \left\lfloor \frac{Y}{A_i}\right\rfloor$ であり、$ \left\lfloor \frac{Y}{A_i}\right\rfloor>\frac{Y}{A_i}-1$より、$X>\frac{Y}{A_i}$ 、すなわち $(X\times A_i)>Y$ が成り立ちます。このとき、 \(X\), \(\left\lfloor \frac{Y}{A_i}\right\rfloor\) はともに \(10^{18}\) 未満であり、後者は整数間の除算によって求めることができるため、\(64\) ビット整数型の範囲でオーバーフローを起こす事なく計算できます。他にも、多倍長整数を用いる方法などもあります。
c++ による実装例:
#include <bits/stdc++.h>
using namespace std;
int main(void){
int n,k;
long long a,y=1,x=1;
cin>>n>>k;
for(int i=0;i<k;i++)y*=10;
y--;
for(int i=0;i<n;i++){
cin>>a;
if(x>(y/a))x=1;
else x*=a;
}
cout<<x<<endl;
return 0;
}
Python による実装例:
n,k=map(int, input().split())
a=list(map(int, input().split()))
x,y=1,10**k-1
for i in range(n):
x*=a[i]
if x>y:
x=1
print(x)
posted:
last update: