牛客练习赛41-简单的数学题 快速沃尔什变换

题目链接: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' 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值