題意:給你a,b,要你求ab的因子和對9901取模的結果。(1<=a<=5e7,0<=b<=5e7)
樣例輸入:2
樣例輸出:15
思路:求因子,首先想到唯一分解定理,把a分解成最簡形式,然後推式子得到a=(1+p1+p12+…+p1cnt1)*(1+p2+…+p2cnt2)…(1+pn+pn2+…pncntn),即等比數列求和之後相乘。
等比數列公式:sn=a1*(qn-1)/(q-1)(q是公比,即提取出來的質因數)
因為過程中要取模,所以我們用快速冪求出qn,在除(q-1)的時候,要乘(q-1)在mod 9901 意義下的逆元,因為9901是個質數,所以我們可以用費馬小定理進行求解。此題得解
得解個der:如果我們有個質因子p,p%9901=1,那我們用費馬小定理求逆元的時候,p-1%9901=0,這時候不存在逆元,所以會出錯。那麼試想,我們p%9901=1,那式子(1+p+p2+…+pcnt) 是不是就等於cnt+1?(因為裡面每一項mod 9901之後都是1),所以計算的時候特判就行了。
**:
#include
#pragma gcc optimize("ofast")
#define endl '\n'
#define null null
#define ls p<<1
#define rs p<<1|1
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define ll long long
#define int long long
#define pii pair
#define ull unsigned long long
#define all(x) x.begin(),x.end()
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ct cerr<<"time elapsed:"<<1.0*clock()/clocks_per_sec<<"s.\n";
char
*fs,
*ft,buf[
1<<20]
;#define gc() (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<20,stdin),fs==ft))?0:*fs++;
inline
intread()
while
(ch>=
'0'&&ch<=
'9')
return x*f;
}using
namespace std;
const
int n=
1e5+5;
const
int inf=
0x3f3f3f3f
;const
int mod=
9901
;const
double eps=
1e-7
;const
double pi=
acos(-
1);vectorv;
ll qpow
(ll a,ll b)
return res;
}signed
main()
for(
int i=
2;i*i<=a;i++
) v.pb(
mp(i,cnt*b));
}}if(a!=1)
v.pb(
mp(a,b));
int res=1;
for(
auto i:v)
cout<}
算術基本定理(唯一分解定理 分解素因子)
include include include include include include include include includeusing namespace std int main printf d a 0 for int i 1 i cnt i printf n return 0...
唯一分解定理
任意乙個大於1的正整數都能表示成若干個質數的乘積,且表示的方法是唯一的。換句話說,乙個數能被唯一地分解成質因數的乘積。因此這個定理又叫做唯一分解定理。c include include include using namespace std int main int num 32 int local...
唯一分解定理
唯一分解定律 又稱為正整數的唯一分解定理,即 每個大於1的自然數均可寫為質數的積,而且這些素因子按大小排列之後,寫法僅有一種方式。當題目有大數相除,求餘數時,精度要求高時.就要運用唯一分解定律 以下唯一分解定律證明 為了真正地證明,分解質因數的方法是唯一的,我們將再次用到反證法。假設存在某些數,它們...