列表

详情


NC19866. 算式子

描述

给定  个整数  。保证 
对于每个  ,求出 。为了避免过量输出,你只需要将所有的 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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Pascal(fpc 3.0.2) 解法, 执行用时: 796ms, 内存消耗: 31584K, 提交时间: 2018-10-19 19:46:47

var
  a,b:array[0..2000001]of int64;
  n,m,i,j,x:longint;
  ans:int64;
begin
  read(n,m);
  for i:=1 to n do
  begin
    read(x);
    inc(a[x]);
  end;
  for i:=1 to m do
  begin
    j:=i;
    while j<=m do
    begin
      inc(b[j],a[i]);
      inc(j,i);
    end;
  end;
  for i:=1 to m do
    inc(b[i],b[i-1]);
  for i:=m downto 1 do
    inc(a[i],a[i+1]);
  for i:=1 to m do
  begin
    j:=i;
    while j<=m do
    begin
      inc(b[i],a[j]);
      inc(j,i);
    end;
  end;
  for i:=1 to m do
    ans:=ans xor b[i];
  writeln(ans);
end.

C++14(g++5.4) 解法, 执行用时: 556ms, 内存消耗: 31716K, 提交时间: 2020-07-14 19:27:24

#include<bits/stdc++.h>
#define int long long
#define N 5000005
using namespace std;
int sum[N],b[N],n,m,x,ans;
signed main(){
    cin>>n>>m;
    for (int i=1;i<=n;i++) scanf("%d",&x),b[x]++;
    for (int i=1;i<=m;i++)
        for (int j=i;j<=m;j+=i) sum[j]+=b[i];
    for (int i=1;i<=m;i++) sum[i]+=sum[i-1];
    for (int i=m;i;i--) b[i]+=b[i+1];
    for (int i=1;i<=m;i++)
        for (int j=i;j<=m;j+=i) sum[i]+=b[j];
    for (int i=1;i<=m;i++) ans^=sum[i];
    printf("%lld\n",ans);
    return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 680ms, 内存消耗: 31680K, 提交时间: 2020-07-14 21:42:45

#include<bits/stdc++.h>
using namespace std;
const int M=2e6+5;
long long n,m,x,ans,cnt[M],sum[M];

int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)scanf("%d",&x),cnt[x]++;
	for(int i=1;i<=m;i++)for(int j=i;j<=m;j+=i)sum[j]+=cnt[i];
	for(int i=1;i<=m;i++)sum[i]+=sum[i-1];
	for(int i=m;i>=1;i--)cnt[i]+=cnt[i+1];
	for(int i=1;i<=n;i++)for(int j=i;j<=m;j+=i)sum[i]+=cnt[j];
	for(int i=1;i<=m;i++)ans^=sum[i];
	printf("%lld\n",ans);
	return (0-0);
}

上一题