https://codeforces.com/contest/1352/problem/C
How to solve this problem??
#include <bits/stdc++.h>
using namespace std;
#pragma GCC target ("avx2")
#pragma GCC optimization ("O3")
#pragma GCC optimization ("unroll-loops")
#define lld long long int
int main() {
// your code goes here
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int t;
cin>>t;
while(t--)
{
lld n,k;
cin>>n>>k;
lld val1=k/n;
k+=val1;
lld val2=k/n;
lld val3=val2-val1;
k+=val3;
//cout<<k<<" "<<val1<<" "<<val2<<"\n";
while(val3!=0)
{
val1=k/n;
val3=abs(val1-val2);
k+=val3;
val2=k/n;
k+=abs(val2-val1);
//cout<<k<<" "<<val1<<" "<<val2<<"\n";
}
cout<<k<<"\n";
}
}
You have to simply count how many numbers are divisible by n. Add that quantity to k. But after this addition again some more numbers are divisible by n. So, you have to add that amount again.Do this until the new k has not any new divisible number
We can use these two observations to form a solution:
void solve() {
lli n, k;
cin >> n >> k;
if(k<n)
cout << k << endl;
else {
k -= n;
cout << n*((k)/(n-1)+1) + (k)%(n-1) + 1<< endl;
}
}
Think in terms of binary_search.
For any integer x such that (x%n==0), it position in multiples of n is given by pos = (x/n),
hence its position in non multiples of n, where (x%n!=0) is given by, pos = x - x/n.
Now, if pos>K, update high = x - 1,
else update low = x + 1 and ans = x.
Can u show your full code please? I can’t implement it.
#include "bits/stdc++.h"
using namespace std;
#define ll long long int
#define lct ll t;cin>>t;while(t--)
void fast_io(){
ios::sync_with_stdio(false);cin.tie(0);
#ifndef ONLINE_JUDGE
freopen ("in.txt","r",stdin);
freopen ("out.txt","w",stdout);
#endif
}
const ll N = 2*1e9 + 7;
int32_t main(){
fast_io();
ll n,k,l,r,ans,pos,mid;
string s;
lct{
cin>>n>>k;
l = 1, r = N;
ans = -1;
while(l<=r){
mid = (l+r)/2;
pos = mid - mid/n;
if(pos>=k){
r = mid-1;
ans = mid;
}else{
l = mid+1;
}
}
cout<<ans<<endl;
}
return 0;
}
its simple;
print(k+(k-1)//(n-1))
for ix in range(int(input())):
n, k = map(int, input().split())
x=k%(n-1)
k-=x
aa=n*(k//(n-1))+x
if aa%n==0:
aa-=1
print(aa)
If you use binary search you don’t even need to pick up pen to formulate. Read the question and code.
void solve(int test_case){
ll n,k;
cin >> n >> k;
ll hi = LLONG_MAX >> 10;
ll lo = 1;
ll ans = hi;
while(lo <= hi){
ll mi = lo + hi >> 1;
ll p = mi - mi/n;
if(p >= k){
ans = mi;
hi = mi-1;
}else{
lo = mi+1;
}
}
cout << ans << "\n";
}
Can someone explain me why the approach is K-1/N-1 in [C - K-th Not Divisible by n]
thanks in advance.
Dry run this for a 2 to 3 test cases and you will get it.
#include<bits/stdc++.h>
typedef long long ll;
typedef unsigned long long ull;
#define FIO ios_base::sync_with_stdio(false);cin.tie(NULL);
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define mt make_tuple
#define SUP INT_MAX
#define INF INT_MIN
#define SSUP LLONG_MAX
#define IINF LLONG_MIN
#define W while
#define ff first
#define ss second
#define vll vector
#define pll pair<ll,ll>
#define vpll vector
#define vvll vector
#define it(r,v) for(auto r=v.begin();r!=v.end();r++)
#define all(v) v.begin(),v.end()
#define in insert
#define FOR(i,n) for(ll i=0;i<n;i++)
#define space cout<<"\n\n";
#define endl ‘\n’
using namespace std;
const ll M = 1e9 + 7;
int main()
{
#ifndef ONLINE_JUDGE
freopen(“input2.txt”, “r”, stdin);
freopen(“output3.txt”, “w”, stdout);
#endif
FIO
ll t; cin >> t;
W(t--) {
ll n, k; cin >> n >> k;
ll m = n - 1;
ll tt = k / m;
if (k % m == 0) {
tt--;
}
ll t1 = tt * m;
ll t2 = tt * n;
ll diff = k - t1;
ll ans = t2 + diff;
cout << ans << '\n';
}
return 0;
}