Codeforces Round #640 (Div. 4) C. K-th Not Divisible by n (数论,思维)

题目链接
题意:
问不能被n整除的第k个数是多少。
1 <= n,k <= 1e9.

思路:

这场让我充分的认识到了我的思维有多差,全是思维题,我却做成那样

举个例子来说明叭:
n = 3,k = 7.
1 2 | 4 5 | 7 8 | 9 10 | 11 12 |
其中竖线是每一个竖线为一组。
既然是不能被n整除,那么肯定是每(n-1)个数为一组,而现在看做一组有n个数(有一个能被n整除的)。

1.那么我们现在就可以算出不能被n整除的前k个数中有多少个组(多少个满编组,如 只有 11 而没有 12 不叫满编)。 k/(n-1)

2.算出来后,我们再算有多少个非满编组。 k%(n-1)

3.再判断非满编组是否为0,如果为0,那么我们在看做一组有n个数的时候其最后一个数是能被整除的,要减去最后一个数,否则要加上非满编组中的元素个数。
//这里看看代码自己想想就很容易知道了,看做一组有n个数后为a*n个数,后面再判断第三步。

#include 
using namespace std;
#define NewNode (ListNode *)malloc(sizeof(ListNode))
#define Mem(a,b) memset(a,b,sizeof(a))
const int N = 1e5 + 5;
const int INF = 0x3f3f3f3f;
const double EPS = 1e-10;
const unsigned long long mod = 998244353;
const double II = 3.1415926535;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> piil;
int main()
{
    std::ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int t;
    cin >> t;
    while(t--)
    {
        ll n,k;
        cin >> n >> k;
        ll a = k/(n-1),b = k%(n-1);//第一步,第二部
        !b ? cout << a*n-1 << endl : cout << a*n+b << endl;//第三步
    }
}

你可能感兴趣的:(codeforces,数论,数学,思维)