能力提升综合题单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;
}
- P5538 【XR-3】Namid[A]me
黑题,暂跳过。 - P5539 【XR-3】Unknown Mother-Goose
黑题,暂跳过。 - P5523 [yLOI2019]珍珠
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 中国剩余定理
中国剩余定理可以快速解一元线性同余方程组。
- P4777 【模板】扩展中国剩余定理(EXCRT)
- P3868 [TJOI2009]猜数字
- P2480 [SDOI2010]古代猪文
- P4774 [NOI2018]屠龙勇士
- P5345 【XR-1】快乐肥宅
Part 6.3.3 高次同余方程
BSGS 算法可以高效计算离散对数。
而高次剩余的求解更加复杂,其中二次剩余作为高次剩余中比较特殊的情况,可以使用 Cipolla 法求解。
Part 6.4 博弈论
博弈论考虑游戏中的个体的预测行为和实际行为,并研究它们的优化策略。

浙公网安备 33010602011771号