zoukankan      html  css  js  c++  java
  • 洛谷——P4932 浏览器

    P4932 浏览器

    __stdcall给了你n个点,第i个点有权值x[i],对于两个点u和v,如果x[u] xor x[v]的结果在二进制表示下有奇数个1,那么在u和v之间连接一个Edge,现在__stdcall想让你求出一共有多少个Edge。

    如果你没能成功完成任务,那么__stdcall会让你痛苦一下,你这个测试点就没分了。

    由于不小心看到这道题,然后一点儿思路都枚举,果断看了题解

    发现了这么一句话(此题关键):

    规律:当两个数的二进制数$1$的个数为一奇一偶时,他们抑或的值的二进制数的个数才为偶数,否则为奇数

    那么答案显然是奇数个数乘以偶数个数

    但是暴力统计时间复杂度为$O(nlogV)$,只可以通过$\%50$的数据

    $bitset$貌似是优化了这个过程,$bitset.count()$STL中表示这个$bitset$的$1$的个数

    #include<bits/stdc++.h>
    
    #define LL long long
    #define N 10000005
    using namespace std;
    
    LL n,a,b,c,d,x[N],sum[2];
    int main()
    {
        scanf("%lld%lld%lld%lld%lld%lld",&n,&a,&b,&c,&d,&x[0]);
        for(int i=1;i<=n;i++){
            x[i]=((a*x[i-1]%d*x[i-1]%d)%d+(b%d*x[i-1]%d)%d+c%d)%d;
            x[i]=(x[i]%d+d)%d;
        }
        for(int i=1;i<=n;i++){
            bitset<100>p=x[i];
            sum[p.count()&1]++;
        }
        
        printf("%lld
    ",sum[1]*sum[0]);
        
        return 0;
    } 
  • 相关阅读:
    Sonar安装与使用说明
    oracle物化视图使用+hibernate
    CAS实现SSO单点登录原理(转)
    冒泡事件通用解法
    百度网盘搜索
    (转)mvn clean install 与 mvn install 的区别(为啥用clean)
    初识Channel
    Java 重入锁 ReentrantLock
    多线程之Future模式
    一天一个类--NIO 之Buffer
  • 原文地址:https://www.cnblogs.com/song-/p/9832285.html
Copyright © 2011-2022 走看看