题目链接:https://ac.nowcoder.com/acm/contest/373/F
乍一看这个题貌似是个数学题,其实仔细一看,就..嘿嘿
其实题目中的函数都可以进行相应的转换f(x)函数在大于等于2时可以理解为x的所有质因子的乘积,因为题目中说明了最大质因子不超过71,也就是第20个质数。之后我们观察发现g函数和异或函数有些类似,因此我们可以想到可以把每个原数组中的数转化为一个不超过1<<20的数。
至此我们已经把所有的数都转化为一组不超过1<<20的数了,现在我们的问题是如何得到三个数组中的每三个数字的异或和。由于本人太菜,在比赛中没有想到,之后看大佬的代码才发现,这TM就是个裸的FWT啊!!(不知道FWT的可以百度)因此思路就完全出来了。
复杂度1e6*log1e6
下面附上ac代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M=1<<20;
const int mod=1e9+7;
const ll rev2=5e8+4;
int pri[20]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71};
ll a[M],b[M],c[M];
template<class T>
void read(T &ans){ //positive integer
char ch=' ';
ans=0;
while(ch<'0'