【题面】
题目描述
对于两个非负整数
给定一个长度为
我们定义函数
例
其中
请求出
输入格式
输入的第一行包含一个正整数
第二行以空格隔开输入
输出格式
输出一行一个整数,表示答案的值。
数据范围
对于 100% 的数据,
各测试点的附加限制如下表所示:
测试点编号 p≤ 特殊性质 1∼8 5 9∼14 9 15∼16 13 保证所有 a[i] 相等 17∼20 18
格式说明
输出时每行末尾的多余空格,不影响答案正确性
输入、输出要求
要求使用「文件输入、输出」的方式解题,输入文件为 func.in,输出文件为 func.out
按:func 是 function 的缩写,意为函数。
样例输入1
2
0 1 2 3
样例输出1
9
样例解释1
因此,答案是
样例输入2
4
6 15 7 15 19 4 1 5 15 20 5 14 11 20 3 4
样例输出2
856
样例解释2
因此,答案是
【解析】
对于每个
证明:一个完整二进制长度为
时间复杂度
【参考代码】
按:popcount 是 population count 的缩写,也叫 sideways sum (数位叠加和),是计算一个整数的二进制表示有多少位是 1 。
按:ios::sync_with_stdio(false); 参考 https://xinxixue.com/i2s7yn
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <bits/stdc++.h> using namespace std; const int N = 3e5 + 5, Mod = 998244353; int main() { freopen ( "func.in" , "r" , stdin); freopen ( "func.out" , "w" , stdout); ios::sync_with_stdio( false ); cin.tie(0); int p, n; cin >> p; n = (1 << p); long long sum = 0; for ( int i = 0; i < n; i++) { int x; cin >> x; sum = (sum + (1ll << (p - __builtin_popcount(i))) * x % Mod) % Mod; } cout << sum; return 0; } |