問題
http://community.topcoder.com/stat?c=problem_statement&pm=11227&rd=14243
M秒間隔でスペースシャトルが到着し、N秒間隔でテレポートが始まる。
スペースシャトルが到着したときにテレポート間隔とぴったりでなければ、次のテレポート時間まで待つ。
このとき、待ち時間の平均時間を求める。
解き方
数学的に解く問題。
サンプルを元に計算すると、
N=10 M=4 (gcd=2 lcm=20)
M:4 8 12 16 20 24 28 32 36 40 44
N: 10 20 30 40 50 60 70
1サイクルの待ち時間 T=6+2+8+4+0=20となる。
また、要素数はlcm/Mとなることがわかる。
また要素をgcdにて割ると、
M':2 4 6 8 10
N': 5 10
1サイクルの待ち時間はT=gcd*(3+1+4+2+0)
また、0,1,...N'-1のすべての要素が出現することがわかる。
つまり、合計待ち時間T、要素数Kと答えとなるT/Kは以下のように計算できる。
T=gcd*N'*(N'-1)/2
=gcd*(N/gcd)(N/gcd-1)/2
=N(N/gcd-1)/2
K=lcm/M=N/gcd
T/K= (N(N/gcd-1)/2) /(N/gcd)
= (N(N/gcd-1)*gcd) /(N*2)
= gcd*(N/gcd-1) /2
=(N-gcd)/2
コード
class Starport {
public:
int gcd(int a,int b){
if(a<b)swap(a,b);
if(a%b==0)return b;
return gcd(b,a%b);
}
double getExpectedTime(int N, int M) {
return (double)(N-gcd(N,M))/2.0;
}
};
public:
int gcd(int a,int b){
if(a<b)swap(a,b);
if(a%b==0)return b;
return gcd(b,a%b);
}
double getExpectedTime(int N, int M) {
return (double)(N-gcd(N,M))/2.0;
}
};