C语言

c++ 网易----数对

2019-08-01  本文已影响6人  PreCon

题目描述:牛牛以前在老师那里得到了一个正整数数对(x, y), 牛牛忘记他们具体是多少了。
但是牛牛记得老师告诉过他x和y均不大于n, 并且x除以y的余数大于等于k。
牛牛希望你能帮他计算一共有多少个可能的数对。
输入描述:输入包括两个正整数n,k(1 <= n <= 10^5, 0 <= k <= n - 1)。
输出描述:对于每个测试用例, 输出一个正整数表示可能的数对数量。

我的思路:这道题的思路就是依次求n到1分别与n到1的余数是否大于等于k,用两个循环嵌套,不过嵌套可以进行加速,不用 n--来进行迭代,比如如果x%y大于等于k,则接下来的x至x%y-k+1个数,他们与y的余数肯定也是大于等于k的,其次如果x%y小于k,则接下来 x%y+1个数他们与y的余数也是小于k的,所以这块只要比较依次就可以了;这样速度就变快了;

#include<iostream>
using namespace std;
typedef long long ll;
int main()
{
    ll x, y, n, k;
    cin >> n >> k;
    ll flag = 0;
    if (k == 0)
    {
        cout << (ll) n*n << endl;
    }
    else
    {
        for (ll i = n; i > 0;)
        {
            y = i;
            for (ll j = n; j > 0;)
            {
                x = j;
                if (x%y >= k&&x > 0)
                {
                    flag += x%y - k + 1;
                    j -= (x%y-k+1);
                }
                else if (x%y < k&&x>0)
                {
                    j -= (x%y + 1);
                }
            }
            --i;
        }
        cout << flag << endl;
    }
    return 0;
}
上一篇 下一篇

猜你喜欢

热点阅读