zoukankan      html  css  js  c++  java
  • 数论模板初期...

    大小只有10k左右....并不是很全....里面有手打的modint,bitset和hashmap(O(1)清空..)

    #include <cmath>
    #include <cstdio>
    #include <cstring>
    #define fon(i,s)    for(int i=0;i<s; ++i)
    #define fone(i,s)   for(int i=0;i<=s;++i)
    #define fox(i,f,t)  for(int i=f;i<t; ++i)
    #define foxe(i,f,t) for(int i=f;i<=t;++i)
    #define fdn(i,s)    for(int i=s;i;   --i)
    #define fdne(i,s)   for(int i=s;~i;  --i)
    #define fdx(i,f,t)  for(int i=f;i>t; --i)
    #define fdxe(i,f,t) for(int i=f;i>=t;--i)
    namespace _nt{
    	#define mod 998244353
    	#define modll 998244353
    	struct intm{
    		int n;
    		inline intm(){ n=0; }
    		inline intm(int nx){ n=nx%mod; }
    		inline intm(long long nx){ n=nx&((2<<31)-1); }
    		friend inline intm operator+(intm a,intm b){ return intm(a.n+b.n); }
    		friend inline intm operator-(intm a,intm b){ return intm(a.n-b.n+mod); }
    		friend inline intm operator*(intm a,intm b){ return intm((long long)a.n*b.n&modll); }
    		friend inline intm operator^(intm a,int b){
    			intm u(1);
    			while(b){
    				if(b&1) u=u*a;
    				a=a*a,b>>=1;
    			}
    			return u;
    		}
    		friend inline intm operator^(intm a,long long b){
    			intm u(1);
    			while(b){
    				if(b&1) u=u*a;
    				a=a*a,b>>=1;
    			}
    			return u;
    		}
    		friend inline intm operator^(intm a,unsigned long long b){
    			intm u(1);
    			while(b){
    				if(b&1) u=u*a;
    				a=a*a,b>>=1;
    			}
    			return u;
    		}
    		friend inline intm operator^(intm a,unsigned int b){
    			intm u(1);
    			while(b){
    				if(b&1) u=u*a;
    				a=a*a,b>>=1;
    			}
    			return u;
    		}
    		friend inline intm operator^(intm a,intm b){
    			return a^(b.n);
    		}
    		friend inline intm operator~(intm a){
    			return a^(mod-2);
    		}
    		friend inline intm operator/(intm a,intm b){
    			return a*(~b);
    		}
    	};
    	struct bitset_u{
    		unsigned long long u;
    		inline bitset_u(){
    			u=0ll;
    		}
    		inline bitset_u(unsigned long long a){u=a;}
    		inline bool get(int n){
    			return (u>>n)&1;
    		}
    		inline void set(int n,bool p){
    			u=(u|(1<<n))&p<<n;
    		}
    		inline bitset_u operator<<(int n){
    			return bitset_u(u<<n);
    		}
    		inline bitset_u operator>>(int n){
    			return bitset_u(u>>n);
    		}
    		inline bitset_u operator^ (bitset_u n){
    			return bitset_u(u^n.u);
    		}
    		inline bitset_u operator& (bitset_u n){
    			return bitset_u(u&n.u);
    		}
    		inline bitset_u operator| (bitset_u n){
    			return bitset_u(u|n.u);
    		}
    		inline bitset_u operator~ (){
    			return bitset_u(~u);
    		}
    	};
    	#define maxn 20000010
    	struct linear_sieve{
    		bool is[maxn];
    		int primes[maxn/10],primelen;
    		inline void operator()(){
    			is[1]=1;
    			for(int i=2;i<maxn;++i){
    				if(!is[i]) primes[primelen++]=i;
    				for(int j=0;j<primelen;++j){
    					if(i*primes[j]>=maxn) break;
    					if(i%primes[j]) is[i*primes[j]]=1; else {
    						is[i*primes[j]]=1;
    						break;
    					}
    				}
    			}
    		}
    	} ls;
    	struct linear_sieve_phi{
    		bool is[maxn];
    		int primes[maxn/10],primelen,phi[maxn];
    		inline void operator()(){
    			is[1]=1;
    			phi[1]=0;
    			for(int i=2;i<maxn;++i){
    				if(!is[i]) primes[primelen++]=i,phi[i]=i-1;
    				for(int j=0;j<primelen;++j){
    					if(i*primes[j]>=maxn) break;
    					if(i%primes[j]) is[i*primes[j]]=1,phi[i*primes[j]]=phi[i]*(primes[j]-1); else {
    						is[i*primes[j]]=1,phi[i*primes[j]]=phi[i]*primes[j];
    						break;
    					}
    				}
    			}
    		}
    	};
    	struct linear_sieve_mu{
    		bool is[maxn];
    		int primes[maxn/10],primelen,mu[maxn];
    		inline void operator()(){
    			is[1]=1;
    			mu[1]=1;
    			for(int i=2;i<maxn;++i){
    				if(!is[i]) primes[primelen++]=i,mu[i]=-1;
    				for(int j=0;j<primelen;++j){
    					if(i*primes[j]>=maxn) break;
    					if(i%primes[j]) is[i*primes[j]]=1,mu[i*primes[j]]=-mu[i]; else {
    						is[i*primes[j]]=1,mu[i*primes[j]]=0;
    						break;
    					}
    				}
    			}
    		}
    	};
    	struct linear_sieve_ds{
    		bool is[maxn];
    		int primes[maxn/10],primelen,mu[maxn],ds[maxn],dp[maxn];
    		inline void operator()(){
    			is[1]=1;
    			ds[1]=1;
    			for(int i=2;i<maxn;++i){
    				if(!is[i]) primes[primelen++]=i,mu[i]=-1;
    				for(int j=0;j<primelen;++j){
    					if(i*primes[j]>=maxn) break;
    					if(i%primes[j]) is[i*primes[j]]=1,ds[i*primes[j]]=ds[i]*dp[i],dp[i*primes[j]]=2; else {
    						is[i*primes[j]]=1,dp[i*primes[j]]=dp[i]+1;
    						break;
    					}
    				}
    			}
    			for(int i=2;i<maxn;++i) ds[i]*=dp[i];
    		}
    	};
    	#define maxm 10000005
    	struct linear_inverse{
    		long long inv[maxm];
    		inline void mx(int n,long long m){
    			inv[1]=1;
    			for(int i=1;i<=n;++i){
    				inv[i]=((-(m/i)*inv[(int)(m%i)])%m+m)%m;
    			}
    		}
    	};
    	typedef unsigned long long ll;
    	ll dev(ll n){//count number of divisors O(sqrt(n))
    		ll res=1,t=2,p;
    		while(n*n>=t){
    			p=1;
    			while(!(n%t)){
    				n/=t;
    				++p;
    			}
    			res*=p;
    			++t;
    		}
    		if(n!=1) res<<=1;
    		return res;
    	}
    	ll sigma(ll n){//count sum of divisors  O(sqrt(n))
    		ll res=1,t=2,tp;
    		while(n*n>=t){
    			tp=t;
    			while(!(n%t)){
    				n/=t;
    				tp*=t;
    			}
    			res*=(tp-1)/(t-1);
    			++t;
    		}
    		if(n!=1) res*=n+1;
    		return res;
    	}
    	//modmul O(1)
    	inline ll modmul(ll a,ll b,ll p){ return ((a*b-(ll)(((long double)a*b)/p)*p)%p+p)%p; }
    	inline ll modpow(ll a,ll e,ll p){//fast power O(log e)
    		ll q=1;
    		while(e){
    			if(e&1) q=modmul(q,a,p);
    			a=modmul(a,a,p);
    			e>>=1;
    		}
    		return q;
    	}
    	inline bool Miller_Rabin_Single(ll a,ll u,ll r,ll n){//primality test for (si-)prime u*2^r+1 base a
    		ll k=modpow(a,u,n),pre=k;
    		while(r--){
    			k=modmul(k,k,n);
    			if(k==1ll && pre!=1ll && pre!=n-1) return 0;
    			pre=k;
    		}
    		return k==1ll;
    	}
    	bool Miller_Rabin(ll n){//test primality
    		if(n==2 || n==3 || n==5 || n==7 || n==11) return 1;
    		if(!(n&1) || !(n%3) || !(n%5) || !(n%7) || !(n%11)) return 0;
    		ll u=n-1,r=0;
    		while(!(u&1)) u>>=1,++r;
    		if(!Miller_Rabin_Single(2,u,r,n)) return 0;
    		if(!Miller_Rabin_Single(1215,u,r,n)) return 0;
    		if(!Miller_Rabin_Single(34862,u,r,n)) return 0;
    		if(!Miller_Rabin_Single(574237825,u,r,n)) return 0;
    		return 1;
    	}
    	template<class T>inline T gcd(T a,T b){//gcd O(log n)
    		T c;
    		while(a){
    			c=b%a;
    			b=a,a=c;
    		}
    		return b;
    	}
    	ll Polard_rho(ll n,ll c,ll u){//factor long long O(n^(1/4))
    		ll i=1,k=2;
    		ll y=u,x0=u;
    		while(1){
    			++i;
    			x0=(modmul(x0,x0,n)+c)%n;
    			ll d=gcd(y-x0,n);
    			if(d!=1 && d!=n) return d;
    			if(y==x0) return n;
    			if(i==k) y=x0,k+=k;
    		}
    	}
    	#define ed 300005
    	#define mi 1333357
    	struct hashmap{//hashmap with O(1) clearing
    		int next[ed][4],h[mi],u,x;
    		inline void operator()(){
    			u=0,next[0][2]=-1,++x;
    		}
    		inline void operator()(long long n,int k){
    			int q=n%mi,t=h[q];
    			while(t && next[t][0]!=n && next[t][3]==x) t=next[t][1];
    			if(!t || next[t][3]!=x){
    				++u;
    				next[u][0]=n,next[u][1]=h[q],t=u,next[u][3]=x;
    				h[q]=u;
    			}
    			next[t][2]=k;
    		}
    		inline int operator[](long long n){
    			int q=n%mi,t=h[q];
    			while(t && next[t][0]!=n && next[t][3]==x) t=next[t][1];
    			if(next[t][3]!=x) return -1;
    			return next[t][2];
    		}
    	};
    	inline unsigned int sqrt(ll x){ return (unsigned int)sqrt((double)x*x); }
    	struct BSGS{//Finding discrete logarithm
    		hashmap q;
    		inline ll operator()(ll a,ll b,ll p){
    			q(),q(1,0);
    			int m=sqrt(p);
    			ll v=modpow(a,p-m-1,p),e=1;
    			fox(i,1,m){
    				e=modmul(a,e,p);
    				q(e,i);
    			}
    			fon(i,m){
    				ll j=q[b];
    				if(~j) return i*m+j;
    				b=modmul(b,v,p);
    			}
    			return -1;
    		}
    	} Baby_Step_Giant_Step;
    	struct _pext_euc{//Solving ax+by=1
    		ll x,y;
    		ll exgcd(ll a,ll b){
    			ll t=0,d=0;
    			if(b){
    				d=exgcd(b,a%b);
    				t=x;
    				x=y;
    				y=t-(a/b)*y;
    				return d;
    			}else{
    				x=1,y=0;
    				return a;
    			}
    		}
    		inline ll operator()(ll a,ll b){
    			return exgcd(a,b);
    		}
    	} Extended_Euclid;
    	ll inv_fast(ll a,ll p){//calculate inverse O(log n) with exgcd
    		Extended_Euclid(a,p);
    		return (Extended_Euclid.x%p+p)%p;
    	}
    	ll eular_phi(ll a){//calculate eular phi O(sqrt(n))
    		ll i=2,t,r=1;
    		while(i*i<=a){
    			if(a%i){ ++i;continue;}else{
    				t=i-1,a=a/i;
    				while(!(a%i)) a=a/i,t=t*i;
    				++i,r=r*t;
    			}
    		}
    		if(a) r=r*(a-1);
    		return r;
    	}
    	struct exBSGS{
    		ll operator()(ll a,ll b,ll p){
    			ll k=0,u,l=1,x=1,A=a,B=b,P=p,ans=0;
    			if(B==1) return 0;
    			if(A==B) return 1;
    			while((u=gcd(a,p))!=1){
    				if(b%u) return -1;
    				++k,l=a/u,b=b/u,p=p/u;
    				x=modmul(l,x,p);
    				if(x==b) ans=k;
    			}
    			ll y=inv_fast(x,p);
    			b=modmul(b,y,p);
    			if(!ans) ans=Baby_Step_Giant_Step(a,b,p);
    			a=A,b=B;
    			fox(i,2,k){
    				a=modmul(a,A,p);
    				if(a==b) return i;
    			}
    			return ans+k;
    		}
    	} extended_Baby_Step_Giant_Step;
    	ll least_primitive_root_for_prime(ll n){//O(g sqrt(n))
    		fox(i,2,n){
    			if(Baby_Step_Giant_Step(i,1,n)==n-1) return i;
    		}
    		return -1;
    	}
    	ll least_primitive_root(ll n){
    		ll p=eular_phi(n);
    		fox(i,2,n){
    			if(extended_Baby_Step_Giant_Step(i,1,n)==p) return i;
    		}
    		return -1;
    	}
    	struct Comb_Number_Small1{//O(mn)-O(1) p none
    		ll CC[2002][2002];
    		inline void init(int n,ll p){
    			CC[1][1]=1;
    			foxe(i,1,n){
    				foxe(j,1,i){
    					CC[i][j]=(CC[i-1][j-1]+CC[i-1][j])%p;
    				}
    			}
    		}
    		inline ll operator()(int n,int m){
    			return CC[n][m];
    		}
    	};
    	struct Comb_Number_Small2{//O(n)-O(1) p prime
    		linear_inverse li;
    		ll facn[maxm],infacn[maxm],pp;
    		inline void init(int n,ll p){
    			li.mx(n,p);
    			facn[1]=1,pp=p;
    			foxe(i,2,n) facn[i]=modmul(facn[i-1],i,p),infacn[i]=modmul(infacn[i-1],li.inv[i],p);
    		}
    		inline ll operator()(int n,int m){
    			if(m>n) return 0;
    			ll a=modmul(infacn[m],infacn[n-m],pp);
    			return modmul(facn[n],a,pp);
    		}
    	};
    	struct Comb_Number_Lucas{
    		Comb_Number_Small2 b;
    		ll pp;
    		inline void init(ll n,ll p){
    			b.init((int)p,p);
    			pp=p;
    		}
    		inline ll operator()(int n,int m){
    			ll ans=1,kk;
    			while(m){
    				kk=b(n%pp,m%pp);
    				ans=modmul(kk,ans,pp);
    				if(!ans) return 0;
    				n/=pp,m/=pp;
    			}
    			return ans;
    		}
    	};
    	struct Comb_Number_factor{
    		linear_sieve s;
    		int count[2000010];
    		inline void init(){
    			s();
    		}
    		inline int calcp(int n,int p){
    			int res=0,pp=p;
    			while(n>=pp) res+=n/pp,pp=p*pp;
    			return res;
    		}
    		inline ll operator()(int n,int m,ll p){
    			int k=m-n;
    			for(int i=0;s.primes[i]<=n;++i) count[i]=calcp(n,s.primes[i]);
    			for(int i=0;s.primes[i]<=m;++i) count[i]-=calcp(m,s.primes[i]);
    			for(int i=0;s.primes[i]<=k;++i) count[i]-=calcp(k,s.primes[i]);
    			ll res=1,pq;
    			for(int i=0;s.primes[i]<=n;++i){
    				pq=modpow(s.primes[i],count[i],p);
    				res=modmul(res,pq,p);
    			}
    			return res;
    		}
    	};
    	#define crtn 400005
    	struct CRT{
    		ll de[crtn],nn[crtn];//product of de should be within range<long long>()
    		inline ll operator()(int n){
    			ll M=1,ans=0;
    			fon(i,n) M*=de[n];
    			fon(i,n){
    				ll t=M/de[n],inv=inv_fast(t,de[n]);
    				ans=(ans+t*inv*nn[n])%M;
    			}
    			return (ans+M)%M;
    		}
    	};
    	struct _solve_linear_congruent_equations{
    		ll de[crtn],nn[crtn];
    		inline void single(ll &x,ll &y,ll c,ll d){
    			ll a=x,b=y;
    			x=gcd(b,d);
    			y=(ll)(((long double)a*b)/x);//lcm a,b
    			ll t=inv_fast(b,d),t2=c-a;
    			x=modmul(t,t2,y);
    		}
    		inline ll operator()(int n){
    			fox(i,1,n) single(nn[0],de[0],nn[i],de[i]);
    			return nn[0];
    		}
    	};
    	ll lcm(ll a,ll b){
    		ll t=gcd(a,b);
    		return (ll)(((long double)a*b)/t);
    	}
    }
    int main(){
    }
    
  • 相关阅读:
    Objective-C中 Self和 Super详解
    OC类方法和实例方法中的self区别
    Objective-C----MRC内存管理 、 自动释放池 、 面向对象三大特性及封装 、 继承 、 组合与聚合
    Objective-C对象初始化 、 实例方法和参数 、 类方法 、 工厂方法 、 单例模式
    Objective-C语言介绍 、 Objc与C语言 、 面向对象编程 、 类和对象 、 属性和方法 、 属性和实例变量
    联合与枚举 、 高级指针 、 C语言标准库(一)
    C语言--- 字符串数组 、 预处理器和预处理指令 、 多文件编程 、 结构体
    C语言----变量及作用域 、 指针 、 指针和数组 、 进程空间 、 字符串
    iOS开发环境C语言基础 数组 函数
    ios开发环境 分支语句 、 循环结构(for) 、 循环结构
  • 原文地址:https://www.cnblogs.com/tmzbot/p/4659855.html
Copyright © 2011-2022 走看看