zoukankan      html  css  js  c++  java
  • Week13 作业 B

    题目描述:

    给定N和K,找第K个不能被N整除的正整数(2 ≤ N ≤ 1e9)、(1 ≤ K ≤ 1e9)

    思路:

    • 很显然要从1开始数,一直数到第K个,很显然数是递增的,再结合如此大的数据范围,可以推测使用二分
    • 二分什么?直接二分答案,那么给定M,如何判断M是不是第K个不能被N整除的数?考虑一个简单的例子:N=3,M=16,则从1到M这16个数中,有3,6,9,12,15是能被N整除的,正好是5个,正好等于16/3,所以M是第M-M/N个不能被N整除的数
    • 但是,注意:不能漏掉最基本的限制条件,M不能被N整除
    • 二分边界:左边界L=K,右边界R=N*K,(其实边界很随意)

    代码:

    #include <cstdio>
    #include <iostream>
    using namespace std;
    typedef long long ll; 
    int main()
    {
    	int T;
    	cin>>T;
    	while(T--)
    	{
    		ll N,K;
    		cin>>N>>K;
    		ll l=K,r=N*K;
    		while(l<=r)
    		{
    			ll m=(l+r)/2;
    			ll al=m-m/N;
    			if(al==K && m%N!=0)
    			{
    				cout<<m<<endl;
    				break;
    			}
    			if(al<K) l=m+1;
    			else r=m-1; 
    		}
    	}
    	return 0;
    } 
    

      

  • 相关阅读:
    leetcode----------Pascal's Triangle II
    leetcode----------Pascal's Triangle
    leetcode----------Climbing Stairs
    leetcode----------Balanced Binary Tree
    HTML的DOM树结构
    记一记流水账
    多校训练4——Hehe
    深啾啾~亚马逊与天猫大比拼
    Photo4
    第一次用FontLad~
  • 原文地址:https://www.cnblogs.com/qingoba/p/13068970.html
Copyright © 2011-2022 走看看