喵喵喵求助T3

题目描述
给定 a 和 b。若一个正整数能够被 a 整除或者被 b 整除,则我们称该正整数为神奇数字。现在给定 n,请你求出第 n 个神奇数字。

答案可能很大,输出对答案mod 10^9+7

输入格式
第一行三个整数 n,a,b。

输出格式
输出一行,代表答案。

样例输入
1 2 3
样例输出
2
样例输入
4 2 3
样例输出
6
数据规模
1 \le n \le 10^9,2 \le a,b \le 4 \times 10^4

我的写法 TLE\,\,40pts

思路:

先枚举一下 \min{a,b} \sim lcm(a,b) 内的满足条件的数,看做一次循环,则共有 \frac{n}{cnt} (cnt为一次循环内的满足条件数个数),接着再枚举最后的一部分就可以了。可是前面的枚举还是会T掉。

#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
  int a,b,n;
  cin>>n>>a>>b;
  int cnt=0;
  int lcm=a/__gcd(a,b)*b;
  for(int i=min(a,b);i<=lcm;i++){
    if(i%a==0||i%b==0){
      cnt++;
    }
    if(cnt==n){
      cout<<i%1000000007;
      return 0;
    }
  }
  int p=n%cnt;
  int q=n/cnt*lcm;
  cnt=0;
  for(int i=q+min(a,b);i<=q+lcm;i++){
    if(i%a==0||i%b==0){
      cnt++;
    }
    if(cnt==p){
      cout<<i%1000000007;
      return 0;
    }
  }
}

球思路(送解决)

图片
不是最小公倍数吗,为啥要min

二分

喵喵喵???

此帖子已被社区举报,现已被临时隐藏。

最近看猫上瘾

我跟你思路差不多

这个是有周期的,周期为a,b的最小公倍数
每一个周期里有a+b这样多的数
用n-(a+b)*k然后再遍历应该就好了

1 个赞

我试试,如果A了给解决

此帖子已被社区举报,现已被临时隐藏。

用二分,要不然时间上过不去

@2345安全卫士 前面的找周期不用一个一个枚举,直接按 a \times b 作为循环周期,算一下里面有几个就可以了,就像这样:

ll t=a+b-__gcd(a,b),f=a*b;
ll ans=n/t*f;
n%=t;
/*余下的n一个一个枚举*/

最后答案就是:

(ans+max(suma,sumb))%mod

yes

(4*10^4)^2过大

需要用到二分

二分答案,找出第一个check结果为n的数

int check(int x){
	return x/a+x/b-x/lcm(a,b);
}

我没用二分过了呀?

数据水???

我先试一下 @杨思越 的方法,看看能不能A(他最先回复的)

行,如果你后来用二分AC了给我一个吧,我说的