[]簡単な数学の卒業シーズンIです
トピックの背景
「ジングルリングリング」、最後の鐘鳴らした大学入試での分岐ジャンクションは、3人の若者が突然、現時点では時間内に固化しました。どのように、まだ失われた歌を忘れないように、将来を楽しみにして、悲しみの別れのことを敵卒業の喜び。より多くの笑いと涙の千の昼と夜よりも、すべてこれは一生の中で最も記憶に残る瞬間でなければならないと信じて、卒業パーティーで集まります!
タイトル説明
優れた卒業パーティーを行うために、私はある程度kの卒業パーティードレスリハーサルを理解することに関与した個人の最大の教師を選ぶにしたいです。しかし、どのようにそれを選択するには?教師は、番号1、2、...、N、k個のクラスを列挙し、Iは、個々の程度を理解すること、それらの最大公約数(これはOH迷信ではない)であると考えています。これは彼のために困難になることができ、助けてください!
PS:最大公約数そのものである数。
入力形式
二つの空間は、正の整数nとkを分離しました。(N> = K> = 1)
出力フォーマット
最大の理解のための整数値。
サンプル入力と出力
コピー入力#1
42
出力#1のコピー
2
説明/ヒント
[ソース]タイトル
オリジナルLZN
[データ範囲]
データの20%を、K <= 2、N <= 1000
データの別の30%、K <= 10、N <= 100
データ、K <= 1E9、N <= 1E9(ベン神学校、多数)の100%に
分析
タイトルは、最大公約数Kの最大数に
1つのK ...数X * 1、X * 2、のように置くことができ 、X * 3。。X * K。xはその最大公約数です。
(例えば、Kであるの数:2 * 4 2,4,6,8 ,, * 1,2 * 2,2 * 3,2とみなすことができる; 2は、それらの最大公約数です)
そうであるので、2 ...、その後、X * kは、nより大きくすることはできません
3 ...我々は、この二分法×(最大公約数)を見つけるために使用することができます。1からnに、各バイナリ参照半ばには、* K> N、かどうか
、これはあまりにも半ばよりも大きければ、半ば1(左ミッド参照)に1を行ってきました。
これはあまり半ば小さな超える場合、ミッドn個のルックアップに進みます。
注:二つのタイムシェアリングは、その後、我々はLが=ミッド+ 1は聞かせて、バイナリLとして(次を探しているとの行の後の行にある見つけることです。その後、次の二つの点を続け、これが最後、その後、一貫性がありませんL)は、回線で最大のものであるので、L-1を作るための最終的な答え
コード
#include<iostream>
using namespace std;
typedef long long ll;
ll n,k;
ll f(ll l, ll r){
int mid;
while(l<=r){
mid = (l+r)/2;
if( mid*k <=n ){
l = mid+1;
}else{
r = mid-1;
}
}
return l-1;
}
int main(){
cin>>n>>k;
cout<<f(1,n)<<endl;;
return 0;
}