求最大公约数:
int gcd(int a,int b)//求a ,b的最大公约数
{
int c=a%b;
while(c)
{
a=b;
b=c;
c=a%b;
}
return b;
}
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}
求组合数公式:
ll fun(ll n,ll m) //求C(n,m)c(n,m)=c(n-1,m)+c(n-1,m-1)可以得到递推公式
{
if(n<m) return 0;
if(m>n/2) m=n-m;
ll z=1,f=1,i;
for(i=1;i<=m;i++)
{
z=z*(n-i+1);
f=f*i;
}
return z/f;
}
int C[501][501];
void fun()
{
C[0][0]=1;
for(int i=0; i<=500; i++)
{
C[i][0]=C[i][i]=1;
for(int j=1; j<i; j++)
C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
}
}
整数输入函数:
void in(int &m)
{
char ch;
int flag=0;
while((ch=getchar())<'0'||ch>'9')
if(ch=='-') flag=1;
for(m=0;ch>='0'&&ch<='9';ch=getchar())
m=m*10+ch-'0';
if(flag) m*=-1;
}
小数输入函数:
void init(double &res)
{
char ch;
int flag=0,tmp=0,n,m,num=0;
while((ch=getchar())<'0'||ch>'9')
if(ch=='-') flag=1;
for(m=0,n=0; (ch>='0'&&ch<='9')|| (ch=='.');ch=getchar())
{
if(ch=='.') { tmp=1;continue;}
if(!tmp) m=m*10+ch-'0';
if(tmp) { n=n*10+ch-'0'; num++;}
}
res=m+n*1.0/pow(10,num);
if(flag) res*=-1;
}
建边及头文件:
#include<cstdio>
#include<cstring>
#include<queue>
#include<iostream>
using namespace std;
#define FF freopen("Input.txt","r",stdin)
#define mem(x,y) memset(x,y,sizeof(x))
#define ll long long
#define inf 1000020
const int N=50010;
int dp1[N],dp2[N];
struct Graph
{
int head[N*2],val[N*2],to[N*2],next[N*2],tot;
void init()
{
tot=0;
mem(head,-1);
}
void add(int u,int v,int w)
{
to[tot]=v;
val[tot]=w;
next[tot]=head[u];
head[u]=tot++;
}
}G;
前n项欧拉函数打表:
// printf("%I64d\n",phi[n]);
#define maxn 3000003
long long phi[maxn];
void phi_table()
{
int i,j;
memset(phi,0,sizeof(phi));
phi[1]=1;
for(i=2;i<=maxn;i++)
{
if(!phi[i])
for(j=i;j<=maxn;j+=i)
{
if(!phi[j]) phi[j]=j;
phi[j]=phi[j]/i*(i-1);
}
phi[i]+=phi[i-1];
}
}
输出a的二进制表示:
void change(int a)
{
int mask=0x80;
printf("%d\n",mask);
while(mask){printf("%d",mask&a?1:0);mask>>=1;}
}
快速打素数:
#define N 10000002
int isprime[N], prime[664580];
inline void get_prime()
{
int q=-1,i,j;
for(i=2;i<N;i++)
{
if(isprime[i]==0) prime[++q]=i;
for(j=0;j<=q&&prime[j]*i<N;j++)
{
isprime[prime[j]*i]=1;
if(i%prime[j]==0) break;
}
}
}