牛客练习赛29 F 算式子
https://www.nowcoder.com/acm/contest/211/F
经典题。
1.分区间
2.向下取整的值变化 & 合并相同值
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 const ll mod=1e9+7; 5 const int maxn=2e6+10; 6 7 ll tot[maxn<<1],f[maxn],g[maxn],add[maxn],ans=0,r; 8 9 int main() 10 { 11 int n,m,a,x,y,i,j; 12 scanf("%d%d",&n,&m); 13 for (i=1;i<=n;i++) 14 { 15 scanf("%d",&a); 16 g[a]++; 17 } 18 for (i=1;i<=m<<1;i++) 19 tot[i]=tot[i-1]+g[i]; 20 for (i=1;i<=m;i++) 21 if (g[i]) 22 { 23 for (j=i;j<=m;j+=i) 24 add[j]+=g[i]; 25 } 26 for (i=1;i<=m;i++) 27 { 28 for (j=1,x=i-1,y=i+i-1;x<=m;j++,x+=i,y+=i) 29 f[i]+=(tot[y]-tot[x])*j; 30 ans+=add[i]; 31 f[i]+=ans; 32 } 33 r=0; 34 for (i=1;i<=m;i++) 35 r=r^f[i]; 36 cout<<r; 37 return 0; 38 } 39 /* 40 3 3 41 1 2 3 42 43 */