数论笔记`
目錄
?
?拓展歐幾里得求線(xiàn)性不定方程:
威爾遜定理:
費(fèi)馬小定理:
?歐拉函數(shù):
約瑟夫環(huán)問(wèn)題:
?拓展歐幾里得求線(xiàn)性不定方程:
LL solve(LL a,LL b,LL m)//求解一元線(xiàn)性同余方程 {LL x,y,d;d=Exgcd(a,m,x,y);if(b%d!=0)return -1;x=x*(b/d)%m;x=(x%(m/d)+(m/d))%(m/d);return x; } 拓展歐幾里得求逆元 int exgcd(int a , int b , int &x , int &y){if(b == 0){x = 1;y = 0;return a;}int d = exgcd(b , a % b , x , y);int t = x;x = y;y = t - a / b * y;return d; } int get(int a,int mod) {int x,y;int d = exgcd(a,mod,x,y);return d==1?(x%mod+mod)%mod:-1; } void Exgcd(ll a, ll b, ll &x, ll &y) {if (!b) x = 1, y = 0;else Exgcd(b, a % b, y, x), y -= a / b * x; } //快速冪算法遞歸算法 long long fastpow2(long long a,int n) {if(n==1) return a;long long tem = fastpow(a,n/2);if(n%2==1) return tem * tem * a;elsereturn tem * tem; } //快速冪非遞歸版本 long long fastpow2(long long a,int n) { long long ans = 1;while(n){if(n&1) ans * a;a *= a;n>>1;}return ans; } int gcd(int a,int b)//輾轉(zhuǎn)相除法求最小公約數(shù) {return b==0 ? a : gcd(b,a%b); } void exgcd(int a,int b,int &x,int &y)//擴(kuò)展歐幾里得定理遞歸版本 {if(b==0){x=1,y=0;return a;}int d=exgcd(b, a%b, x, y);int t=y;y = x-(a/b)*y,x=t; } void getprimefactor(int n)//唯一分解定理 {for(int i=1;i<=cnt&&pri[i]*pri[i]<=n;++i){while(n%pri[i]==0){n/=pri[i];fac[++cnt2]=i;power[cnt2]++;}}if(n>1) fac[++cnt2]=n,power[cnt2]=1; } int maxn = 1e4; int pri[maxn],cnt=0; int getprime(int n)//O(n^2)復(fù)雜度 {for(int i=2;i<=n;i++){int flag=1;for(int j=2;j<n;j++){if(i%j==0){flag=0;break;}}if(flag)pri[++cnt]=i;} } int maxn = 1e4; int isprime[maxn]; int getprime2(int n)//艾氏篩法 復(fù)雜度O(n*logn*logn) {for(int i=1;i<=n;i++) isprime[i]=1;isprime[0]=isprime[1]=0;for(int i=2;i<=n;i++){if(isprime[i]){prime[cnt++]=i;for(itn j=i*i;j<=n;j+=i)isprime[j]=0;}}} int getprime3(int n)//線(xiàn)性篩法(歐拉篩)復(fù)雜度O(n) {for(int i=2;i<=n;i++){if(!isprime[i]) pri[++cnt]=i;for(int j=1;j<=cnt;j++){if(i*pri[j]>n) break;isprime[i*pri[j]]=1;if(i%pri[j]==0) break;}} }威爾遜定理:
????????p 為質(zhì)數(shù)? ( p ? 1 ) ! ≡ ? 1 (mod ?p)?
費(fèi)馬小定理:
????????對(duì)于素?cái)?shù)p和任意的整數(shù)a(a!=0),有:%pa%p
? ? ? ??若(a,p)=1,??≡ 1(mod p)
#include<cstdio> using namespace std; long long n,p; long long ans[5000010]={0,1}; int main() {scanf("%lld%lld",&n,&p);printf("1\n");for(long long i=2;i<=n;i++) //線(xiàn)性遞推{ans[i]=(long long)(p-p/i)*ans[p%i]%p;printf("%lld\n",ans[i]); } }?歐拉函數(shù):
? ? ? ? 1.對(duì)于素?cái)?shù)p:f(p) = p-1;
? ? ? ??2. f() = -; p與互質(zhì),p的倍數(shù)與互質(zhì),所以個(gè)數(shù)是/p個(gè)
????????
int eular(int n)//歐拉函數(shù)代碼 {int ans = n;//初始化為nfor(int i=2;i*i<=n;i++){if(n%i==0)ans = ans/i*(i-1);//找質(zhì)因子while(n%i==0)n/=i;//排除其他因子} if(n>1)ans = ans/n*(n-1);//驗(yàn)證return ans; } void phi() {eular[1];for(int i=2;i<=maxn;i++){if(!eular[i])//埃氏篩找素?cái)?shù) {eular[i] = i-1;for(int j=2*i;j<=maxn;j+=i)//i的倍數(shù)中肯定存在i是質(zhì)因子 {if(!eular[j]) eular[j] = j;//歐拉函數(shù)中ans = n; eular[j] = eular[j]/i*(i-1);//此時(shí)i就是j的一個(gè)質(zhì)因子 }}}for(int i=3;i<=maxn;i++){eular[i]+=eular[i-1];} }約瑟夫環(huán)問(wèn)題:
?Josephus Problem - LightOJ 1179 - Virtual Judge
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 1e6+10;int ysf(int n,int k,int i) {if(i==1)return (n-1+k)%n;elsereturn (ysf(n-1,k,i-1)+k)%n;} int main() {int t;cin>>t;int cas=1;while(t--){int n,k;cin>>n>>k;printf("Case %d: %d\n",cas++,ysf(n,k,n)+1);}return 0 ; }?費(fèi)馬大定理:
?勾股數(shù)定理:
當(dāng)a為奇數(shù)時(shí):
a=2*k+1? ? ;b=2*k*k+2*k? ? ;? ? ?c=2*k*k+2*k+1;
當(dāng)a為偶數(shù)時(shí):?
a=2*k? ;? ? b=k*k-1? ?;? ? c=k*k+1;
?
?矩陣快速冪模板:
#include<bits/stdc++.h> #define int long long using namespace std; const int mod = 9973; struct mat {int m[15][15]; }; mat mull(mat a,mat b,int n) {mat c;memset(c.m,0,sizeof(c.m));for(int i=1; i<=n; i++){for(int j=1; j<=n; j++){for(int k=1; k<=n; k++){c.m[i][j] = (c.m[i][j]+((a.m[i][k]*b.m[k][j])%mod))%mod;}}}return c; }mat mpow(mat a,int b,int n) {mat ans;memset(ans.m,0,sizeof(ans.m));for(int i=1; i<=n; i++)ans.m[i][i] = 1;while(b){if(b&1)ans = mull(ans,a,n);a = mull(a,a,n);b/=2;}return ans; }signed main() {//freopen(".in", "r", stdin);//freopen(".out", "w", stdout);// ios::sync_with_stdio(false);int t;cin>>t;while(t--){int n,k;cin>>n>>k;int ans=0;mat a;for(int i=1; i<=n; i++)for(int j=1; j<=n; j++)cin>>a.m[i][j];a = mpow(a,k,n);for(int i=1; i<=n; i++)ans = (ans+a.m[i][i])%mod;cout<<ans<<endl;}return 0; } a.m[0][0]=1;a.m[0][1]=1;a.m[0][2]=1;a.m[0][3]=1;a.m[0][4]=1;a.m[0][5]=1;a.m[0][6]=1;a.m[1][0]=1;a.m[1][1]=1;a.m[1][2]=1;a.m[1][3]=1;a.m[1][4]=1;a.m[1][5]=1;a.m[1][6]=1;a.m[2][0]=1;a.m[2][1]=1;a.m[2][2]=1;a.m[2][3]=1;a.m[2][4]=1;a.m[2][5]=1;a.m[2][6]=1;a.m[3][0]=1;a.m[3][1]=1;a.m[3][2]=1;a.m[3][3]=1;a.m[3][4]=1;a.m[3][5]=1;a.m[3][6]=1;a.m[4][0]=1;a.m[4][1]=1;a.m[4][2]=1;a.m[4][3]=1;a.m[4][4]=1;a.m[4][5]=1;a.m[4][6]=1;a.m[5][0]=1;a.m[5][1]=1;a.m[5][2]=1;a.m[5][3]=1;a.m[5][4]=1;a.m[5][5]=1;a.m[5][6]=1;a.m[6][0]=1;a.m[6][1]=1;a.m[6][2]=1;a.m[6][3]=1;a.m[6][4]=1;a.m[6][5]=1;a.m[6][6]=1;?廣義斐波那契數(shù)列構(gòu)造:
??
????
總結(jié)