• 2023NOIP A层联测10 集合


    题目大意

    你有一个正整数 n n n和一个大小为 m m m的可重集 B B B

    每次你可以可重集 B B B中选择一个数 x x x,将 x x x变为 ⌊ n x ⌋ \lfloor \dfrac nx\rfloor xn

    问通过上述操作,能将 n n n变成多少种不同的数。

    1 ≤ n ≤ 1 0 15 , 1 ≤ x ≤ 1 0 15 , 1 ≤ m ≤ 10 1\leq n\leq 10^{15},1\leq x\leq 10^{15},1\leq m\leq 10 1n1015,1x1015,1m10

    时间限制 1 s 1s 1s


    题解

    首先,我们知道, ⌊ n d ⌋ \lfloor \dfrac nd\rfloor dn的取值个数是 O ( n ) O(\sqrt n) O(n )的。证明如下:

    • 1 ≤ d ≤ n 1\leq d\leq \sqrt n 1dn 时,最多有 n \sqrt n n d d d,也就是 n \sqrt n n ⌊ n x ⌋ \lfloor \dfrac nx\rfloor xn,故此时取值个数是 O ( n ) O(\sqrt n) O(n )
    • n < d ≤ n \sqrt nn <dn时, 1 ≤ ⌊ n x ⌋ ≤ n 1\leq \lfloor \dfrac nx\rfloor\leq \sqrt n 1xnn ,故此时取值个数是 O ( n ) O(\sqrt n) O(n )

    所以, ⌊ n d ⌋ \lfloor \dfrac nd\rfloor dn的取值个数是 O ( n ) O(\sqrt n) O(n )的。

    直接搜索,然后用 m a p map map记录每个值是否被搜索过。不过,因为调用 m a p map map还要一个 log ⁡ \log log的时间复杂度,所以我们考虑小于等于 n \sqrt n n 的数用一个数组标记,大于 n \sqrt n n 的数用 m a p map map标记。

    时间复杂度为 O ( n log ⁡ n ) O(\sqrt n\log n) O(n logn)

    最坏情况下的数据如下:

    1000000000000000 10
    2 3 5 7 11 13 17 19 23 29
    
    • 1
    • 2

    如果用上述方法来实现,这个数据只要跑不到 500 m s 500ms 500ms,所以是可以过的。

    code

    #include
    using namespace std;
    int m;
    long long n,ans=0,x[15];
    bool z[33000005];
    map<long long,bool>mp;
    void dfs(long long t){
    	if(t<=sqrt(n)){
    		if(z[t]) return;
    		z[t]=1;
    	}
    	else{
    		if(mp[t]) return;
    		mp[t]=1;
    	}
    	++ans;
    	for(int i=1;i<=m;i++){
    		dfs(t/x[i]);
    	}
    }
    int main()
    {
    //	freopen("set.in","r",stdin);
    //	freopen("set.out","w",stdout);
    	scanf("%lld%d",&n,&m);
    	for(int i=1;i<=m;i++){
    		scanf("%lld",&x[i]);
    		if(x[i]==1){
    			--i;--m;
    		}
    	}
    	sort(x+1,x+m+1);
    	m=unique(x+1,x+m+1)-x-1;
    	dfs(n);
    	printf("%lld",ans);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
  • 相关阅读:
    linux发展历程
    Java高级学习篇之网络编程
    iwebsec靶场搭建
    【图论】最小生成树
    eclipse 添加注释
    重生之我是一名程序员 31
    uniapp 实现双击点赞出现特效
    java毕业设计家教管理系统mybatis+源码+调试部署+系统+数据库+lw
    坪山区关于开展2022年度科技创新专项资金申报工作的通知
    基于javaweb+mysql数据库实现的学生选课管理系统项目源代码
  • 原文地址:https://blog.csdn.net/tanjunming2020/article/details/133862331