2019校招真题编程(五)数对

题目描述

网易

牛牛以前在老师那里得到了一个正整数数对(x, y), 牛牛忘记他们具体是多少了。

但是牛牛记得老师告诉过他x和y均不大于n, 并且x除以y的余数大于等于k。
牛牛希望你能帮他计算一共有多少个可能的数对。

输入包括两个正整数n,k(1 <= n <= 10^5, 0 <= k <= n - 1)。
对于每个测试用例, 输出一个正整数表示可能的数对数量。

我的思路

产生 x % y > = k x\%y >= k 的条件在于 x > = k , y > k x>=k, y>k

x = i y + k x = i*y + k'

注意特殊情况,当k=0时,数对应该有 N N N*N

假设n=10,k=3,则对y来说只能是4,5,6,7,8,9,10

  • 当y=4, (n/y)*(y-k) 代表x小于等于8(8是4的整数倍)时有(3,4),(7,4), max(0,n%y-k+1) 代表x大于8时符合题意的对数为0
  • 当y=5,(n/y)*(y-k)代表x小于等于10(10是5的整数倍)时有(3,5),(4,5),(8,5),(9,5),max(0,n%y-k+1)代表x大于10时符合题意的对数为0
  • 当y=6,(n/y)*(y-k)代表x小于等于6时有(3,6),(4,6),(5,6),Math.max(0,n%y-k+1)代表x大于6时符合题意的对数为2,分别是(9,6),(10,6)
  • 当y=7,(n/y)*(y-k)代表x小于等于7时有(3,7),(4,7),(5,7),(6,7),Math.max(0,n%y-k+1)代表x大于7时符合题意的对数为1,是(10,7)
  • 以此类推

= = 不知道为啥我一个测试案例也过不去

= = 好了我知道了,我把n和k翻了

#include <iostream>
using namespace std;

int main()
{
    int n, k;
    cout<<"enter k and n: ";
    
    cin>>k>>n;
    long res=0;
    
    if(k==0)
    {
        res = (long)n*n;
    }
    else{
        for(int y=k+1; y<=n; y++)
        {
            res += (n/y)*(y-k);
            res += max(0, n%y-k+1);
        }
    }
    
    cout<<res<<endl;
    return 0;
}

解题答案

#include <iostream>
using namespace std;

int main()
{

    int n, k; 
    cin >> n >> k;
    long long int count = 0;
    if (k == 0) {
        count = n;
        count = count*count;
    }
    else {
        for (int y = k + 1; y <= n; y++) {
            count += n / y*(y - k) + (n % y >= k ? n % y - k + 1 : 0);
        }
    }
    cout << count;
    return 0;
}

发布了68 篇原创文章 · 获赞 2 · 访问量 6165

猜你喜欢

转载自blog.csdn.net/qq_30050175/article/details/104114956