zoukankan      html  css  js  c++  java
  • 牛客练习赛29 F 算式子

    链接:https://www.nowcoder.com/acm/contest/211/F
    来源:牛客网

    题目描述

    给定  个整数  。保证 
    对于每个  ,求出 。为了避免过量输出,你只需要将所有的 m 个结果异或起来输出。

    输入描述:

    第一行两个整数  。
    第二行  个整数,第  个表示  。

    输出描述:

    一行一个整数,表示所有结果异或起来的结果。
    示例1

    输入

    复制
    2 2
    1 2

    输出

    复制
    0

    说明

    当 
    x=1
     时,结果为 
    4


    当 
    x=2
    时,结果为  
    4
     。

    所以输出 
    0
    示例2

    输入

    复制
    10 10
    1 3 5 5 2 5 9 3 1 10

    输出

    复制
    60

    备注:

     
     
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <algorithm>
     4 using namespace std;
     5 const int N = 2e6+5;
     6 #define ll long long 
     7 ll num1[N],a[N];
     8 int n,m,x;//定义在外面时间会短写
     9 int  main()
    10 {
    11     scanf("%d%d",&n,&m);
    12     13     for(int i = 1;i<= n;i++) {
    14         scanf("%d",&x);
    15         num1[x]++;
    16         
    17     }
    18     
    19     for(int  i=1 ;i<= m;i++){
    20         for(int j =i;j<=m;j+=i){
    21             a[j]+=num1[i];
    22         }
    23     }
    24     for(int i =1;i<=m;i++){
    25         a[i]+=a[i-1];//每个i,所有的floor(i/x)的累加和。
    26     }
    27     
    28     

    29     
    30     
    31     for(int i =m;i>=1;i--) num1[i]+=num1[i+1];//i~m所有数出现次数的和。
    32     
    33     for(int  i =1;i<= m;i++){
    34              for(int  j =i;j<=m;j+=i){
    35                 a[i]+=num1[j];//每个i,所有的floor(x/i)的累加和。


    36             }
    37     }
    38     ll ret = 0;
    39     
    40     for(int  i =1;i<= m;i++){
    41         
    42         ret^=a[i];
    43     }
    44     printf("%lld
    ",ret);
    45     return  0;
    46 }
  • 相关阅读:
    F. 数学上来先打表
    LibreOJ β Round #2
    noip飞扬的小鸟
    jxoi2017
    分块算法
    Chino的数列
    cf 613E
    cf 126D
    cf 542E
    cf 512D
  • 原文地址:https://www.cnblogs.com/tingtin/p/9833380.html
Copyright © 2011-2022 走看看