NC238811. 法力无边
描述
| | |
0 | 0 | 1 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
输入描述
输入共两行。
第一行 个整数 ,含义如题。
第二行 个自然数,第 个数为 ,含义如题。
输出描述
输出共一行,为所求值。
示例1
输入:
2 1 1 1
输出:
3
说明:
指定位数为 时, ,故示例2
输入:
2 2 1 1
输出:
5
说明:
指定位数为 时, ,故C++(g++ 7.5.0) 解法, 执行用时: 31ms, 内存消耗: 956K, 提交时间: 2022-10-05 21:27:52
#include<stdio.h> #include<algorithm> using namespace std; typedef long long ll; ll n,m,x,ans; ll sum[1000020][2]; int main() { scanf("%lld%lld",&n,&m); for(int i=1;i<=n;i++) { scanf("%lld",&x); for(int j=0;j<m;j++) { if((x>>j)&1) sum[j][1]++; else { swap(sum[j][1],sum[j][0]); sum[j][0]++; } ans+=sum[j][1]*(1<<j); } } printf("%lld",ans); return 0; }
C++(clang++ 11.0.1) 解法, 执行用时: 34ms, 内存消耗: 420K, 提交时间: 2022-10-03 11:18:39
#include<bits/stdc++.h> #define ll long long using namespace std; ll n,m,x,ans,sum[100009][2]; int main() { cin>>n>>m; for(int i=1;i<=n;i++) { scanf("%lld",&x); for(int j=0;j<m;j++) { if((x>>j)&1) sum[j][1]++; else { swap(sum[j][1],sum[j][0]); sum[j][0]++; } ans+=sum[j][1]*(1<<j); } } cout<<ans; return 0; }