P1445 [Violet]樱花(质因数分解)
Posted Harris-H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1445 [Violet]樱花(质因数分解)相关的知识,希望对你有一定的参考价值。
P1445 [Violet]樱花(质因数分解)
1
x
+
1
y
=
1
n
!
\\dfrac1x+\\dfrac1y = \\dfrac1n!
x1+y1=n!1
n
!
(
x
+
y
)
=
x
y
x
y
−
n
!
(
x
+
y
)
+
(
n
!
)
2
=
(
n
!
)
2
(
x
−
n
!
)
(
y
−
n
!
)
=
(
n
!
)
2
\\beginaligned & n!(x+y) = xy \\\\ & xy-n!(x+y) + (n!)^2 = (n!)^2 \\\\ & (x-n!)(y-n!) = (n!)^2 \\endaligned
n!(x+y)=xyxy−n!(x+y)+(n!)2=(n!)2(x−n!)(y−n!)=(n!)2
令
a
=
(
x
−
n
!
)
,
b
=
(
y
−
n
!
)
a=(x-n!),b=(y-n!)
a=(x−n!),b=(y−n!)
则 a b = ( n ! ) 2 ab=(n!)^2 ab=(n!)2
每个 ( a , b ) (a,b) (a,b)映射唯一的 ( x , y ) (x,y) (x,y)。
考虑对 ( n ! ) 2 (n!)^2 (n!)2 质因数分解。
则 ( n ! ) 2 = p 1 c 1 × p 2 c 2 ⋯ × p k c k (n!)^2 = p_1^c_1\\times p_2^c_2\\dots \\times p_k^c_k (n!)2=p1c1×p2c2⋯×pkck
则答案是 ∏ i = 1 k ( c i + 1 ) \\prod_i=1^k (c_i+1) ∏i=1k(ci+1)
如何计算 n ! n! n!的质因数分解呢。
考虑对于质数 p p p。
统计 p p p的个数, p 2 , p 3 … p^2,p^3\\dots p2,p3… 等的贡献。
显然一个 p p p的个数就是: n p \\dfracnp pn。
包含第二个p的个数就是: n p 2 \\dfracnp^2 p2n。依此类推。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=1e6+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const int hashmod[4] = 402653189,805306457,1610612741,998244353;
#define mst(a,b) memset(a,b,sizeof a)
#define db double
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define x first
#define y second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define ios ios::sync_with_stdio(false),cin.tie(nullptr)
void Print(int *a,int n)
for(int i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\\n",a[n]);
template <typename T> //x=max(x,y) x=min(x,y)
void cmx(T &x,T y)
if(x<y) x=y;
template <typename T>
void cmn(T &x,T y)
if(x>y) x=y;
bitset<N>vis;
int p[N],cnt;
ll c[N];
void ss(int n)
vis[0]=vis[1]=1;
for(int i=2;i<=n;i++)
if(!vis[i]) p[++cnt]=i;
for(int j=1;j<=cnt&&i*p[j]<=n;j++)
vis[i*p[j]]=1;
if(i%p[j]==0) break;
int main()
int n;
scanf("%d",&n);
ss(n);
for(int i=1;i<=cnt;i++)
int x = p[i];
for(ll j=x;j<=n;j*=x) c[i]+=n/j;
c[i]%=mod;
//c[i]%=mod;
ll ans = 1;
for(int i=1;i<=cnt;i++)
ans=ans* (c[i]*2+1) %mod;
printf("%lld\\n",ans);
return 0;
以上是关于P1445 [Violet]樱花(质因数分解)的主要内容,如果未能解决你的问题,请参考以下文章