函数中记得用(a+1),而不是(a++)
[NOIP提高组(2018)考试技巧及注意事项] (https://blog.csdn.net/hi_ker/article/details/81181615)
1.保持好的心态
2.审题
3.考虑严谨
4.代码正确
5.freopen
6.检查
还有注意检查你的程序是否在考试指定文件夹里面,而且不能存在指定文件夹的子文件夹里面
7.防爆(防止爆数组)
8.头文件
9.数据类型
10.增加程序的鲁棒性(Robust)
11.注意隐性错误(非常重要)
以下讨论主要是基于windows考试环境
1.时间复杂度的选择
2.利用Dev C++
3.对拍
4.巧用cmd(选学)
5.查错
6.骗分
[信息学竞赛常用函数/模板] (https://blog.csdn.net/Hi_KER/article/details/82973124)
- 扩展欧几里得算法
void exgcd(int a,int b,int& d,int& x,int& y){
if(!b){
d=a,x=1,y=0;return;}
exgcd(b,a%b,d,y,x);y-=x*(a/b);
}
- 乘法逆元
void exgcd(int a,int b,int& d,int& x,int& y){
if(!b){
d=a,x=1,y=0;return;}
exgcd(b,a%b,d,y,x);y-=x*(a/b);
}
int inverse(int a,int m){
int x,y,d;
exgcd(a,m,d,x,y);
return d==1?(x%m+m)%m:-1;
}
- 高精度模板
https://blog.csdn.net/Hi_KER/article/details/80982710
- O ( N ) O(\sqrt {N}) O(N)计算欧拉函数
int phi(int x){
int ans=x,m=sqrt(x+0.01);
for(int i=2;i<=m;i++) if(x%i==0){
ans=ans/i*(i-1);
while(x%i==0) x/=i;
}
if(x>1) ans=ans/x*(x-1);//x为质数
return ans;
}
- 线性时间复杂度生成欧拉函数表+质数表
/*
p|n && p*p|n phi(n)=phi(n/p)*p
p|n && !p*p|n phi(n)=phi(n/p)*(p-1)
*/
int v[maxn],pri[maxn],phi[maxn];
void eular(int n){
int num=0;//number of prime
for(int i=2;i<=n;i++) {
if(v[i]==0){
//v[i]:i 的最小质因子
v[i]=i,pri[++num]=i;
phi[i]=i-1;
}
for(int j=1;j<=num;j++){
if(pri[j]>v[i]||pri[j]>n/i) break;
v[i*pri[j]]=pri[j];
phi[i*pri[j]]=phi[i]*(i%pri[j]?pri[j]-1:pri[j]);
}
}
for(int i=1;i<=n;i++) printf("phi(%d)=%d\n",i,phi[i]);
}
- BSGS算法(说明:用于计算高次同余方程 a x ≡ b ( m o d p ) a ^ x \equiv b\ (mod\ p) ax≡b (mod p) 的最小非负数解,其中 p p p为素数,时间复杂度 O ( P ) O(\sqrt{P} ) O(P),返回 − 1 -1 −1表示无解)
int pow_mod(int a,int n,int p){
int ret=1;
while(n){
if(n&1) ret=(long long)ret*a%p;
a=(long long)a*a%p,n>>=1;
}
return ret;
}
map<int,int>mp;
int bsgs(int a,int b,int p){
if(a%p==0) return b?-1:0;
mp.clear();
int m=ceil(sqrt(p)),T=b%p;
mp[T]=0;
for(int i=1;i<=m;i++)
mp[T=(long long)T*a%p]=i;
int t=pow_mod(a,m,p);T=1;
for(int i=1;i<=m;i++){
T=(long long)T*t%p;
if(mp.count(T)) return i*m-mp[T];
}
return -1;
}
- 卢卡斯(Lucas)定理
int C(int N,int M,int p){
if(N<M) return 0;
if(!n) return 1;
return (ll)fac