能力提升综合题单Part6 数学1(6.1-6.4)

Part 6 数学

Part 6.1 位运算

将十进制整数转换为二进制后,有很多按位运算的运算符。

如果能善于利用位运算的一些性质,往往能达到事半功倍的效果。

problem

略。

constraint

对于 \(95\%\)的数据:\(k \leq 2^{63} - 1\)
对于 \(100\%\) 的数据:\(1 \leq n \leq 64, 0 \leq k \lt 2^n\)

solution

  • 栽在了\(\texttt{unsigned long long}\)上,提个醒吧。
  • 一道基础的二进制题,考场上纯模拟了(显然当时根本不知道二进制可以这么用)。

code

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
const int maxn=1e6+10;
const int maxm=5e5+10;
const int mod=1e9+7;
#define int long long
#define inf 0x3f3f3f3f3f
int read(){
	int a=0,op=1;char c=getchar();
	while(c<'0'||c>'9') {if(c=='-') op=-1;c=getchar();}
	while(c>='0'&&c<='9') a*=10,a+=c^48,c=getchar();
	return a*op;	
}
int n;
unsigned int k;
signed main(){
	scanf("%lld%llu",&n,&k);
	k^=k>>1;
	while(~--n) printf("%llu",(k>>n&1));
	return 0;	
}

problem

给定一个\(N\)个数的序列\(a_i\),将它们分成若干组,使得所有组的异或和的和最大,输出这个最大值。
每组应至少包含一个数。

constraint

\(N\le 10^6,a_i\le 10^9\)

solution

注意到\(a\oplus b\le a+b\),所以把所有元素异或起来输出即可

code

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
const int maxn=1e6+10;
const int maxm=5e5+10;
const int mod=1e9+7;
#define int long long
#define inf 0x3f3f3f3f3f
int read(){
	int a=0,op=1;char c=getchar();
	while(c<'0'||c>'9') {if(c=='-') op=-1;c=getchar();}
	while(c>='0'&&c<='9') a*=10,a+=c^48,c=getchar();
	return a*op;	
}
int n,a,ans;
signed main(){
	n=read(),ans=read();
	for(int i=1;i<n;i++) a=read(),ans^=a;
	printf("%lld",ans);
	return 0;	
}

problem

constraint

solution

code


Part 6.2 整除相关

与整除相关的概念有很多,比较常用的有素数,最大公约数和欧拉函数。

Part 6.2.1 素数

素数,指的是除 1 和它本身之外没有其他约数的数。

problem

constraint

solution

code


problem

constraint

solution

code

#include<cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn=2e5+10;
#define int long long
int read(){
	int a=0,op=1;char c=getchar();
	while(c<'0'||c>'9') {if(c=='-') op=-1;c=getchar();}
	while(c>='0'&&c<='9') {a*=10,a+=c^48,c=getchar();}
	return a*op;
}
int n;
#undef int 
int main(){
#define int long long
	n=read();
	for(int i=sqrt(n);i>=2;i--){
		if(n%i==0){
			printf("%lld\n",n/i);break;	
		}
	}
	return 0;
}

problem

constraint

solution

code


problem

constraint

solution

code


Part 6.2.2 最大公约数

如果两个数有一个共同的约数,那么这个约数就被称为公约数。最大公约数就是指这两个数的所有公约数中,最大的一个。

求解两个数的最大公约数,可以采用欧几里得算法解决。

problem

constraint

solution

code


problem

constraint

solution

code


Part 6.2.3 欧拉函数

欧拉函数 $ \varphi (x) $ 表示了小于 $ x $ 的数字中,与 $ x $ 互质的数字个数。

Part 6.3 同余方程

求解同余方程往往可以引出不少话题。

Part 6.3.1 线性同余方程&乘法逆元

线性同余方程是同余方程中最基础的内容。

Part 6.3.2 中国剩余定理

中国剩余定理可以快速解一元线性同余方程组。

Part 6.3.3 高次同余方程

BSGS 算法可以高效计算离散对数。

而高次剩余的求解更加复杂,其中二次剩余作为高次剩余中比较特殊的情况,可以使用 Cipolla 法求解。

Part 6.4 博弈论

博弈论考虑游戏中的个体的预测行为和实际行为,并研究它们的优化策略。

posted @ 2020-12-22 17:08  齐思钧  阅读(119)  评论(0)    收藏  举报