• 第四届“传智杯”全国大学生IT技能大赛(初赛同步) 小卡与质数2 数论


    链接

    有意思的思维题

    乍一看不太可做,因为质数的出现没啥规律。

    实际上确实是这样,我们与其枚举y,不如枚举更难找到规律的质数。

    所以题目等价于对于给定的一个x,枚举所有质数(设当前枚举的质数为k),看有多少个质数满足 k异或x的结果 小于 x

    转化成了这样也不能莽做,思考一下,x异或上什么样的数才能使结果小于x?

    很明显,如果k的二进制中最高位是第h位,考虑x的二进制中的每一位,当且仅当x的第h位上也是1的时候,k异或x的结果 小于 x

    所以我们预处理所有质数它们的最高位是哪一位,并开个桶记录一下,对于每个询问把x拆位求一下就好了。

    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<string>
    #include<cstdio>
    #define LL long long
    using namespace std;
    int T,n,tot,ans;
    int zhi[2000010],vis[2000010],cnt[35];
    void YYCH()
    {
    	for(int i=2;i<=2000000;++i)
    	{
    		if(!vis[i])zhi[++tot]=i;
    		for(int j=1;j<=tot&&i*zhi[j]<=2000000;++j)
    		{
    			vis[i*zhi[j]]=1;
    			if(!(i%(zhi[j])))break;
    		}
    	}
    	for(int i=1;i<=tot;++i)
    		for(int j=25;j>=1;--j)
    			if(zhi[i]&(1<<(j-1)))
    			{
    				++cnt[j];
    				break;
    			}
    }
    int main()
    {
    	YYCH();
    	cin>>T;
    	while(T--)
    	{
    		scanf("%d",&n);ans=0;
    		for(int i=25;i>=1;--i)
    			if(n&(1<<(i-1)))ans+=cnt[i];
    		printf("%d\n",ans);
    	}
    	return 0;
    }
    
  • 相关阅读:
    C# Lambda表达式 (转)
    用C#读取txt文件的方法(转)
    c#中stringbuilder的使用(转)
    c# 日期和时间的获取(转)
    C# List<T>用法 泛型 (转)
    indent format codes
    格式化输入输出 小结
    putty connection manager 一些问题的整理
    linux 网络的一些书籍
    Oracle学习笔记
  • 原文地址:https://www.cnblogs.com/wljss/p/15710151.html
Copyright © 2020-2023  润新知