数论&&组合数学_模板
来源:互联网 发布:淘宝印度大麻种子 编辑:程序博客网 时间:2024/06/04 20:45
1.Gcd
int gcd(int x,int y){ return y==0?x:gcd(y,x%y);}int gcd(int x,int y){ if(x%y==0)return y; else return gcd(y,x%y);}
2.逆元
int ex_gcd(int a,int b,int &x,int &y) { if(b==0) { x=1; y=0; return a; } int ans=ex_gcd(b,a%b,x,y); int tmp=x; x=y; y=tmp-a/b*y; return ans; } int mod_inverse(int a,int m) { int x,y; ex_gcd(a,m,x,y); return (x%m+m)%m;//如果直接求解出来的x是一个负数,那么显然我们要将其转化成正数。 }
3.Ex_Gcd
#include<stdio.h>#include<string.h>using namespace std;int x,y;int ex_gcd(int a,int b,int &x,int &y){ if(b==0) { x=1; y=0; return a; } int ans=ex_gcd(b,a%b,x,y); int tmp=x; x=y; y=tmp-a/b*y; return ans;}int main(){ int a,b; while(~scanf("%d%d",&a,&b)) { ex_gcd(a,b,x,y); printf("%d %d\n",x,y); }}
4.埃拉托色尼筛法
void init() { memset(Is_or,0,sizeof(Is_or)); for(int j=2;j<sqrt(maxn);j++)// { if(Is_or[j]==0)//去掉合数的倍数. for(int k=j+j;k<=maxn;k+=j)//去掉倍数.(把这么些个合数的倍数都标记上这个数不是素数.) Is_or[k]=1; } for(int i=2;i<=maxn;i++) { if(Is_or[i]==0) { su[cont++]=i; } } }
5.素数区间筛
void init(){ tot=0; memset(Is_or,0,sizeof(Is_or)); for(ll i=2;i<=Maxn;i++) { if(Is_or[i]==0) { prime[tot++]=i; for(ll j=i+i;j<=Maxn;j+=i) { Is_or[j]=1; } } }}void Get_prime(ll L,ll R){ memset(ans,0,sizeof(ans)); for(ll i=0;i<tot;i++) { ll b=L/prime[i]; while(b*prime[i]<L||b<=1)b++; for(ll j=b*prime[i];j<=R;j+=prime[i]) { if(j>=L) { ans[j-L]=1; } } }}
6.CMN (杨辉三角)
#define mod 5645618765const int MAXN = 100; // 组合上限long long int c[MAXN][MAXN]; // 组合数void GetGroup(){ c[0][0] = c[1][0] = c[1][1] = 1; for (int i=2; i<MAXN; ++i) { c[i][0] = 1; for (int j=1; j<=i; ++j) c[i][j] = (c[i-1][j] + c[i-1][j-1])%mod; // 求模,防止结果过大 } return ;}CMN=m!/n!(m-n)!
7.Phi函数模板 欧拉降幂模板
long long eular(long long n) { long long ans = n; int q = (int)sqrt(n); for (int i=2; i<=q; i++) { if (n % i == 0) { ans -= ans / i; while (n % i == 0) { n /= i; } } } if (n > 1) { ans -= ans / n; } return ans;}
9.Cnm%
#include<stdio.h>#include<string.h>#include<vector>using namespace std;#define LL __int64#define MOD 1000000007llconst LL mod = 1000000007;const LL N = 100000+5;const LL M=1e5+3;vector<LL >mp[100500];LL ans;LL n,k;LL vis[100500];LL fac[100005]; //阶乘LL inv_of_fac[100005]; //阶乘的逆元LL qpow(LL x,LL n){ LL ret=1; for(; n; n>>=1) { if(n&1) ret=ret*x%mod; x=x*x%mod; } return ret;}void init(){ fac[1]=1; for(int i=2; i<=M; i++) fac[i]=fac[i-1]*i%mod; inv_of_fac[M]=qpow(fac[M],mod-2); for(int i=M-1; i>=0; i--) inv_of_fac[i]=inv_of_fac[i+1]*(i+1)%mod;}LL C(LL a,LL b){ if(b>a) return 0; if(b==0) return 1; return fac[a]*inv_of_fac[b]%mod*inv_of_fac[a-b]%mod;}//(C(k,n)-C(k,cont)-C(k,n-cont)+MOD)%MOD;LL Dfs(int u){ vis[u]=1; LL cont=1; for(LL int i=0;i<mp[u].size();i++) { LL v=mp[u][i]; if(vis[v]==0) { LL tmp=Dfs(v); ans=(ans+(C(n,k)%MOD-C(tmp,k)%MOD-C(n-tmp,k)%MOD)%MOD+MOD)%MOD; cont+=tmp; } } return cont;}int main(){ while(~scanf("%I64d%I64d",&n,&k)) { init(); memset(vis,0,sizeof(vis)); for(LL i=1;i<=n;i++)mp[i].clear(); for(LL i=1;i<=n-1;i++) { LL x,y; scanf("%I64d%I64d",&x,&y); mp[x].push_back(y); mp[y].push_back(x); } ans=0; Dfs(1); printf("%I64d\n",(ans+MOD)%MOD); } //prLLf("%I64d\n",C(5,2));}9.分解质因子
memset(prime,0,sizeof(prime)); memset(num,0,sizeof(num)); for(int i=2;i<=5000005;i++) { if(prime[i]==0) { for(int j=i;j<=5000005;j+=i) { int temp=j; while(temp%i==0) { num[j]++; temp/=i; } prime[i]=1; } } }
阅读全文
0 0
- 数论&&组合数学_模板
- 数学模板 - 组合数学
- 数学模板 - 数论基础
- HDU 3944 组合数学+数论
- poj 3252 组合数学,数论
- HDU 4390 组合数学&数论
- 模板:组合数学
- 数学_几何模板
- poj2992数论与组合数学,略水。。。
- hdu 4790 数论 实现 组合数学
- BZOJ 2142 礼物 组合数学+数论
- CodeForces 396A 数论 组合数学
- 暑假集训-组合数学及数论
- bzoj 2142 礼物 (组合数学+数论)
- UVa 10892 LCM Cardinality (数论+组合数学)
- ACM学习_数学基础之数论
- 组合数学_学习笔记(四)
- hdu 3944 DP? 组合数学与数论的结合
- 可靠数据传输原理(下)
- 算法学习笔记--6.trailing-zeros
- java: 多进程简易操作
- 论文笔记一Temporal Segment Networks: Towards Good Practices for Deep Action Recognition
- HDOJ1671 字典树入门题+模板程序(指针实现)
- 数论&&组合数学_模板
- centos7 搭建git2.11.0和gitosis服务
- 第九天
- 使用命令行编译打包运行自己的MapReduce程序 hadoop2.7.3
- Unity3D
- JZOJ1203. 染色的立方体(2017.8B组)
- [Baltic2009]Radio Transmission题解
- 合并两个排序链表
- 希尔排序