7/21日課堂總結
知識點
唯一分解定理
唯一分解定理:任何一個大於1的整數,可以唯一拆分為若干個質因子的乘積。
質因子:本身就是質數的因子。
for(int i = 2; i * i <= n; i++)
if( !(n % i))
{
sum += i;
if(i*i!=n)
sum+=n/i;
}
$$
h=p1 ^ k1 * p2^k2 * p3k3*p4k4*...pm^km
$$
p[i]代表不同的質因子
唯一分解定理引理:一個整數x最多存在一個大於√x的質因子。
for(long long i = 2; i * i <= x; i++)//從最小的質因子開始(ll不要亂開,會影響時間)
while(!(x % i))
cout << i << ' ',x /= i;//說明i是一個質因子
if(x != 1)
cout << x << ' ';//還剩下空格
數學公式
$$
d | n==n%d
$$
d|n:代表n能被d整除。
n%d:判斷一個數字n是否能被d整除。
n和d都能夠進行唯一分觸:
-
n分解的質因子種類包含,d分解所有的質因子種類。
-
d包含的所有質因子的出現次數,小於等於n對應的質因子的出現次數
$$
(ab)c==a(bc)==(p1(k1)...pm(km))==p1(nc)...pn((km)^2)
$$
習題
B3715 分解質因子 2
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 2;
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define le length()
typedef long long ll;
void solve()
{
ll n;
cin>>n;
if(n<=1)
return ;
for(ll i=2;i*i<=n;i++)
while(n%i==0)
{
cout<<i<<' ';
n/=i;
}
if(n!=1)
{
cout<<n<<'\n';
return ;
}
cout<<'\n';
return ;
}
int main()
{
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int T;
cin>>T;
while(T--)
solve();
return 0;
}
B2138 最大質因子序列
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 2;
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define le length()
typedef long long ll;
int f(int x)
{
int maxx=-1;
for(int i=2;i*i<=x;i++)
while(!(x%i))
maxx=max(maxx,i),x/=i;
if(x!=1)
maxx=max(maxx,x);
return maxx;
}
int main()
{
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int n,m;
cin>>n>>m;
fo(i,n,m-1)
cout<<f(i)<<',';
cout<<f(m);
return 0;
}
P10495 階乘分解 ||P2043 質因子分解
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 2;
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define le length()
typedef int ll;
map<ll,ll> q;
void solve(ll n)
{
for(ll i=2;i*i<=n;i++)
while(n%i==0)
n/=i,q[i]++;
if(n!=1)
q[n]++;
return ;
}
int main()
{
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int n;
cin>>n;
for(int i=2;i<=n;i++)
solve(i);
for(int i=2;i<=n;i++)
if(q[i])
cout<<i<<' '<<q[i]<<'\n';
return 0;
}