首页 > 其他分享 >二进制序列额运算

二进制序列额运算

时间:2024-11-03 20:57:35浏览次数:1  
标签:运算 二进制 ll int 序列 mul mod inv jc

二进制序列额运算

题意:

面对一个长度为 n 的数列 a。

∑(i,j,k,l=1~n) (a_i or a_j) xor (a_k and a_l)

结果对2^32取模

思路:

遇到相邻的数又加又减,大脑灵光一现,认为这题有规律可以找,

于是乎,杨辉三角数就有了着落,

一开始,使用暴力O(n^2)计算杨辉三角数,TLE了

后来看了jzjr的题解,知道了二项式定理,其中我们使用组合数计算杨辉三角数即可。

代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long 
const int N=1e5+10;
const ll mod=1e9+7;
int n;
ll a[N],mul[N];
ll jc[N],jc_inv[N];

ll qpower(ll a,ll b,ll mod) {
	ll res=1,mul=a;
	while(b) {
		if(b&1) res=res*mul%mod;
		mul=mul*mul%mod; b>>=1;
	}
	return res;
}

void init() {
	jc[0]=jc_inv[0]=1;
	for(int i=1;i<=100000;i++) {
		jc[i]=jc[i-1]*i%mod;
	}
	jc_inv[100000]=qpower(jc[100000],mod-2,mod);
	for(int i=99999;i>=1;i--) {
		jc_inv[i]=jc_inv[i+1]*(i+1)%mod;//????
	}
}

ll C(ll i,ll j) {
	if(j>i) return 0;
	if(j==0) return 1;
	return jc[i]*jc_inv[i-j]%mod*jc_inv[j]%mod;
}

int main() {
	freopen("B.in","r",stdin);
	freopen("B.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++) {
		cin>>a[i];
	}
	init();
	ll res1=0,res2=0,chu;
	int lim=(n+1)/2;
	for(int i=1;i<=lim;i++) {
		mul[i]=C(lim-1,i-1);
	}
	for(int i=1;i<=lim;i++) {
		if(i&1) {
			res1+=mul[i]*a[i*2-1];
			if(res1<0) {
				chu=res1/mod;
				res1=(chu+1)*mod+res1;
			}
			res1%=mod;
		}
		else {
			res1+=(-mul[i]*a[i*2-1]);
			if(res1<0) {
				chu=res1/mod;
				res1=(chu+1)*mod+res1;			
			}
			res1%=mod;
		}
	}
	if(n%2==0) {
		for(int i=1;i<=lim;i++) {
			if(i&1) {
				res2+=(mul[i]*a[i*2]);	
				if(res2<0) {
					chu=res2/mod;
					res2=(chu+1)*mod+res2;			
				}			
				res2%=mod;
			}
			else {
				res2+=(-mul[i]*a[i*2]);	
				if(res2<0) {
					chu=res2/mod;
					res2=(chu+1)*mod+res2;			
				}				
				res2%=mod;					
			}
		}	
	}
	res1+=res2;
	if(res1<0) {
		chu=res1/mod;
		res1=(chu+1)*mod+res1;			
	}	
	res1%=mod;
	cout<<res1;
	return 0;
}

标签:运算,二进制,ll,int,序列,mul,mod,inv,jc
From: https://www.cnblogs.com/UeesugiSakura/p/18523963

相关文章

  • 机器学习在金融时间序列分析中的应用毕业论文【附数据】
    ......
  • java 对象序列化
    文章目录对象状态保存与序列化序列化的基本原理实现对象序列化的步骤示例代码代码说明序列化中的关键点序列化的应用场景自定义序列化方法多次序列化序列化多个对象:多次序列化同一个对象序列化相同内容的对象同一对象序列化后的追踪修改一,reset()方法二,储存在不同的文件内......
  • 最长公共子序列
    P1439【模板】最长公共子序列DP的经典例题,适合学完导弹拦截后再来学习O(\(N^2\))按照DP常规思考方法我们令dp[i][j]为P1序列前i个子序列和P2序列前j个子序列的最长公共子序列长度注意,这是一种常见的设dp状态的方式,可以积累)所以我们进而思考状态转移方程对于\(dp[i][j]\)......
  • 二进制补码及与原码的互相转换方法详解
    在数字计算机系统中,数据的表示和处理是至关重要的一环。二进制作为计算机内部的基本编码方式,其表示形式直接决定了计算机处理数据的效率和准确性。在二进制表示中,原码和补码是两种重要的编码方式,尤其在处理有符号整数时显得尤为重要。本文将深入探讨二进制补码的概念、作用以及其......
  • LeetCode 3165.不包含相邻元素的子序列的最大和:单点修改的线段树(动态规划)
    【LetMeFly】3165.不包含相邻元素的子序列的最大和:单点修改的线段树(动态规划)力扣题目链接:https://leetcode.cn/problems/maximum-sum-of-subsequence-with-non-adjacent-elements/给你一个整数数组nums和一个二维数组queries,其中queries[i]=[posi,xi]。对于每个查......
  • 鲜花:基于位运算的 A+B Problem
    前置知识:二进制、按位与&、按位异或^、左移<<。按位异或的本质是二进制下不进位的加法,也就是对于每一位将值相加再直接对\(2\)取模。由于^和+有相同之处,考虑什么时候两者不同,很明显是二进制下需要进位的时候,那么什么时候需要进位呢?枚举可知,只有两个数该位都为\(1\)是该位需要......
  • 序列化与反序列化+SQL函数
    序列化其实就是一种对象,平时写的自定义类,内存上就是对象,可以保存到硬盘上,就是序列化,反过来就是反序列化序列化:对象转换为字节反序列化:字节重构为对象实际上也是输入输出流,只不过加了Object即ObjectOutputStreamObjectOutputStream类构造方法:OutputStream里面传的是FileO......
  • 时间序列算法---ARIMA
      现代时间序列分析方法主要有两个不同的方向:一个方向是由外向内的分析视角产生的方法是与确定性因素分解相关的方法;一个方向是由内向外的分析视角产生的方法是时域分析方法。一、确定性因素分析方法  因素分解方法认为所有的序列波动都可以归纳为受到如下四大类因素......
  • 嵌入式课程day05-C语言运算符和选择结构
    4.8其他运算符自增自减:++--三目运算符:?:复合运算符:+= -=*=/=%= &= |=^= <<=>>=逗号运算符:,4.8.1自增自减:++--实现变量的+1或者-1操作++:单目运算符前置:++a后置:a++①如果++运算符作为单独语句使用++在前,++在后没有区别②如果++运算符参与其他......
  • javascript 基本语法,变量,运算符【知识点整理】
    JavaScript(ES5)JavaScript的基本语法和变量变量声明与变量赋值的方法:vara=5;vara=5;varb=4;vara=3,b=2;vara,b,c=5;vara=b=c=1;变量的命名规范首字符:英文和下划线组成:英文数字下划线禁忌:关键字、保留字##Unicode在HTML中,Unicode字符......