7/21日課堂總結

非气盈门發表於2024-07-21

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都能夠進行唯一分觸:

  1. n分解的質因子種類包含,d分解所有的質因子種類。

  2. 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;
}