数论模板合集(更新中)

it2022-05-05  165

注:部分为未开\(long\ long\)且未取模

#include<cstdio> #include<algorithm> #include<ctype.h> #include<vector> #include<queue> #include<cstring> #define lowbit(x) (x&-x) #define ll long long #define ld double #define reint register int #include<map> #include<stdlib.h> #include<ctime> #define mod 19260817 using namespace std; const int maxn=(1e7*2)+2; ll n,p,inv[maxn]; inline ll add(ll a,ll b,ll p){return a+b<p?a+b:a+b-p;} inline ll mul(ll a,ll b,ll p){return a*b<p?a*b:a*b%p;} inline ll add(ll a,ll b){return a+b<mod?a+b:a+b-mod;} inline ll mul(ll a,ll b){return a*b<mod?a*b:a*b%mod;} struct arr{ ll n,m; ll a[21][21]; ll *operator[](int b){return a[b];} inline arr(ll c=0,ll d=0) { memset(a,0,sizeof(a)); n=c,m=d; } arr operator*(arr b) const { arr c; c.n=n;c.m=b.m; for(reint i=0;i<n;i++) for(reint j=0;j<c.m;j++) for(reint k=0;k<m;k++) c[i][j]=add(c[i][j],mul(a[i][k],b[k][j])); return c; } arr operator*=(arr a){ *this=*this*a; return *this; } arr operator^(ll b) { arr ans; ans=arr(n,m); for(reint i=0;i<n;i++) ans[i][i]=1; while(b) { if(b&1ul) ans*=*this; *this*=*this; b>>=1ul; } return ans; } }; void getni(ll p) { inv[1]=1; for(int i=2;i<=n;i++) inv[i]=mul(add(-p/i,p,p),inv[p%i],p); } int mg(int a,int b,int c) { int ans=1; while(b) { if(b&1) ans=(ans*a)%c; b>>=1; a=a*a%c; } return ans; } int exgcd(int a,int b,int &x1,int &y1) { if(!b) { x1=1,y1=0; return a; } int x2,y2; int d=exgcd(b,a%b,x2,y2); x1=y2,y1=x2-(a/b)*y2; return d; } int crt(int a[],int m[],int n) { int M=1,ans=0; for(int i=1;i<=n;i++) M*=m[i]; for(int i=1;i<=n;i++) { int ni,tmp;int mi=M/m[i]; exgcd(mi,m[i],ni,tmp); if(!ni) ni=M; ans=(ans+M*ni*a[i])%M; } return ans<0?ans+M:ans; } int excrt(int a[],int m[],int n) { int M=m[1],t,ni,tmp,d,ans=a[1]; for(int i=2;i<=n;i++) { d=exgcd(M,m[i],ni,tmp); if((a[i]-ans)%d) return -1; t=m[i]/d,ni*=(a[i]-ans)/d,ni=(ni%t+t)%t; ans+=M*ni,M=M/d*m[i],ans%=M; } return ans<0?ans+M:ans; } int main(){}

转载于:https://www.cnblogs.com/KatouKatou/p/9818355.html

相关资源:各显卡算力对照表!

最新回复(0)