题目描述

  给你一个序列 \(a_0,a_1,\ldots,a_{n-1}\)。你要进行 \(t\) 次操作,每次操作是把序列 \(x\) 变为序列 \(y\),满足 \(y_i=\oplus_{j=0}^{k-1}x_{(i+j)\bmod n}\)。\(\oplus\) 表示异或。

  求 \(t\) 次操作后的序列。

  \(1\leq k\leq n\leq 500000,t\leq {10}^{18}\)

题解

  设 \(f_{i,j}\) 为原序列进行 \(i\) 次操作后是哪些数的异或和。

  设 \(F_i(x)=\sum_{j=0}^{n-1}f_{i,j}x^j\)

  那么 \(F_i(x)=(1+x+\cdots x^{k-1})F_{i-1}(x)\)。

  注意到模 \(2\) 意义下的多项式的平方是很好求的,只需要把所有 \(x^i\) 改成 \(x^{2i}\) 就好了。因为其他项的系数都是 \(2\)的倍数。

  所以 \(F_{2^t}(x)=1+x^{2^t}+\cdots+x^{(k-1)2^t}\),那么乘上 \(F_{2^t}(x)\) 就是
\[ y_i=\oplus_{j=0}^{k-1}x_{(i+j\times 2^t)\bmod n} \]
  然后暴力算就可以了。

  时间复杂度:\(O(n\log t)\)

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
#include<functional>
#include<cmath>
#include<vector>
//using namespace std;
using std::min;
using std::max;
using std::swap;
using std::sort;
using std::reverse;
using std::random_shuffle;
using std::lower_bound;
using std::upper_bound;
using std::unique;
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef std::pair<int,int> pii;
typedef std::pair<ll,ll> pll;
void open(const char *s){
#ifndef ONLINE_JUDGEchar str[100];sprintf(str,"%s.in",s);freopen(str,"r",stdin);sprintf(str,"%s.out",s);freopen(str,"w",stdout);
#endif
}
int rd(){int s=0,c,b=0;while(((c=getchar())<'0'||c>'9')&&c!='-');if(c=='-'){c=getchar();b=1;}do{s=s*10+c-'0';}while((c=getchar())>='0'&&c<='9');return b?-s:s;}
void put(int x){if(!x){putchar('0');return;}static int c[20];int t=0;while(x){c[++t]=x%10;x/=10;}while(t)putchar(c[t--]+'0');}
int upmin(int &a,int b){if(b<a){a=b;return 1;}return 0;}
int upmax(int &a,int b){if(b>a){a=b;return 1;}return 0;}
const int N=500010;
bool c[N];
int a[N];
int b[N];
int d[N];
int n,k;
ll m;
int gcd(int a,int b)
{return b?gcd(b,a%b):a;
}
int cnt;
int plus(int a,int b)
{a+=b;return a>=n?a-n:a;
}
int minus(int a,int b)
{a-=b;return a<0?a+n:a;
}
void gao(int t)
{if(!t)return;memset(c,0,sizeof c);memcpy(b,a,sizeof a);int kk=k%(2*n/gcd(t,n));for(int i=0;i<n;i++)if(!c[i]){cnt=0;for(int j=i;!c[j];j=plus(j,t))d[++cnt]=j,c[j]=1;int s=0;int now=d[cnt];for(int j=0;j<kk;j++,now=plus(now,t))s^=b[now];a[d[cnt]]=s;for(int j=cnt-1;j>=1;j--){now=minus(now,t);s^=b[d[j]];s^=b[now];a[d[j]]=s;}}
}
int main()
{open("b");scanf("%d%d%lld",&n,&k,&m);for(int i=0;i<n;i++)a[i]=rd();for(ll i=1;i<=m;i<<=1)if(m&i)gao(i%n);for(int i=0;i<n;i++)printf("%d ",a[i]);return 0;
}

转载于:https://www.cnblogs.com/ywwyww/p/9250649.html

【XSY3126】异或II 数学相关推荐

  1. 关于异鬼II bootkit病毒的关情况

    近日,CNCERT收到腾讯公司关于一款名为"异鬼II"的bootkit病毒在互联网上大量传播的情况报告.CNCERT及时开展监测分析,发现我国境内已有大量用户感染,对我国互联网安全 ...

  2. LintCode 1652. 区间异或 II

    1. 题目 给定数组 A(下标从0到n-1,n为数组长度),和一个查询列表. 每一项查询包括两个整数 i 和 k. 对于每次查询,计算Ai, A(i + 1), ..., A(i+k-1)的异或值.结 ...

  3. P5514 永夜的报应(异或,数学)

    P5514 永夜的报应 做kruskal重构树腻了,来拓展下视野... 题目描述 定义一组数的权值为该组内所有数的异或和. 请求出一种分组方案,使得分出的所有组数的权值之和最小,输出权值之和的最小值. ...

  4. 10行代码AC——UVa 10940(Throwing cards away II 数学规律+约瑟夫环)

    励志用尽量少的代码做高效表达 题目(提交)链接-->UVa-10940 问题分析 本题的时间要求是3s,但极限数据量为50W*50W,一般来说,3s的时间只能支持不到三千万次的运算,也就是说,即 ...

  5. hdu 1165 Eddy's research II(数学:等差 等比公式)

    给出一个递归形式,推出通项公式即可 很容易推得A(1,x) = x+2 则A(2, x) = A(1, A(2, x-1)) = A(2, 0) + 2*x = A(1,1) + 2*x = 2*x+ ...

  6. 数学运算符“异或”的妙用

    异或的妙用 异或的介绍 异或的作用 异或的巧用 问题及代码实现 运行结果 结束语 异或的介绍 异或,英文为exclusive OR,缩写成xor. 异或(xor)是一个数学运算符.它应用于逻辑运算.异 ...

  7. 不可思议的Word2Vec系列一数学原理

    对于了解深度学习.自然语言处理NLP的读者来说,Word2Vec可以说是家喻户晓的工具,尽管不是每一个人都用到了它,但应该大家都会听说过它--Google出品的高效率的获取词向量的工具. I. Wor ...

  8. 异或运算_专题 | 异或运算的一些应用

    点击上方蓝字设为星标 每周一.三.五上午 8:30 准时推送 下面开始今天的学习- 定义 异或是一个数学运算,用于逻辑运算.如果 a.b 两个值不同,则异或结果为 1 ,否则结果为 0 .真值表如下: ...

  9. c语音异或运算符_C语言中的按位异或运算符有什么用处?

    原标题:C语言中的按位异或运算符有什么用处? 想知道C语言中的按位异.运算符有什么用处,首先C语言中^为按位异或运算符,若两个二进制位相同,则结果为0,不同为1 例: #include "s ...

最新文章

  1. 易生信群体和单细胞转录组专题第6期于5月10日在北京开课了
  2. php之static静态变量详解
  3. fedora18装一些软件及配置
  4. OpenFire源码学习之二十五:消息回执与离线消息(下)
  5. 树莓派python实例_使用Python实现树莓派WiFi断线自动重连实例(附代码)
  6. Android 横竖屏切换时 Dialog 布局自适应
  7. docker-compose初试及命令基础
  8. [BZOJ 4563]放棋子
  9. bash: 未预期的符号 `( 附近有语法错误_安规群中关于泄漏电流测试、接地符号等相关的6个问题,快来围观大神的回答吧!...
  10. Redis的AOF日志
  11. 人类遗传变异神库 | ClinVar数据库详解
  12. ElasticSearch核心基础之映射
  13. 【Spring AOP】AOP 底层实现原理 —— 动态代理类的创建(JDK、CGlib)、工厂如何加工原始对象
  14. Android 之 下拉框(Spinner)的使用
  15. JVM虚拟机之二 堆内存
  16. 框架学习笔记:Unity3D的MVC框架——StrangeIoC
  17. MATLAB图像拼接算法及实现(一)
  18. 暴雪战网重装失败问题解决
  19. 支配树 / Dominator_Tree(待补)
  20. 【外网不好用】可以尝试添加dns即可解决上不去外网的问题。

热门文章

  1. 什么是梯度爆炸与梯度消失
  2. 鸿蒙系统安装第三方应用是什么,网友表示:鸿蒙最新系统可以通过连接U盘安装第三方软件了...
  3. Hash学习(3)-冲突的解决
  4. 忽略validateRequest设置
  5. Hack The Box——Remote
  6. JVM调优之 -Xms -Xmx -Xmn -Xss
  7. C语言实现strcpy和strcmp
  8. Linux攻关之基础模块十二 进程相关
  9. linux安全之系统安全
  10. 【嵌入式】任意波特率的合理计算——高波特率、低误差