1. 程式人生 > 實用技巧 >題解 CF1352C 【K-th Not Divisible by n】

題解 CF1352C 【K-th Not Divisible by n】

實際發表時間:2020-05-12
https://www.luogu.com.cn/problem/CF1352C
求第\(k\)個不被\(n\)整除的數

Solution

首先可以想到暴力列舉,但是看到資料範圍,肯定會TLE.
那麼就得換一個思路了。
我們按每個正整數對\(n\)除的商和餘可以得到一個表格:

1 2 \(\cdots\) \(n-1\) \(n\)
\(n+1\) \(n+2\) \(\cdots\) \(2n-1\) \(2n\)
\(\cdots\) \(\cdots\) \(\cdots\) \(\cdots\) \(\cdots\)
\(xn+1\) \(xn+2\)
\(\cdots\) \((x+1)n-1\) \((x+1)n\)

由於我們只要不被\(n\)整除的,那麼就把最後一列去掉:

1 2 \(\cdots\) \(n-1\)
\(n+1\) \(n+2\) \(\cdots\) \(2n-1\)
\(\cdots\) \(\cdots\) \(\cdots\) \(\cdots\)
\(xn+1\) \(xn+2\) \(\cdots\) \((x+1)n-1\)

現在就要求表格裡的第\(k\)個數。不難發現,第\(k\)個數就在第\(x=\left\lceil\dfrac{k}{n-1}\right\rceil\)

行第\(y=(k-1) \bmod (n-1) +1\)列,那麼這個數就是\(n(x-1)+y\),直接計算即可

Code

#include<bits/stdc++.h>
using namespace std;
 
inline void readint(int &x)//快讀
{
    int f=1;x=0;
    char ch=getchar();
    while(!isdigit(ch))
    {
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while(isdigit(ch))
    {
        x=(x<<3)+(x<<1)+ch-48;
        ch=getchar();
    }
    x*=f;
}
 
int t,n,k;
 
inline int myceil(int x,int y){return x%y?x/y+1:x/y;}//x/y的向上取整
 
int main()
{
    readint(t);
    while(t--)
    {
        readint(n),readint(k);
        int x=myceil(k,n-1),y=(k-1)%(n-1)+1;//計算行列
        printf("%d\n",n*(x-1)+y);//輸出答案
    }
    return 0;
}