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)=xyxyn!(x+y)+(n!)2=(n!)2(xn!)(yn!)=(n!)2
a = ( x − n ! ) , b = ( y − n ! ) a=(x-n!),b=(y-n!) a=(xn!),b=(yn!)

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]樱花(质因数分解)的主要内容,如果未能解决你的问题,请参考以下文章

Copy自某谷题解P1445 [Violet]樱花

解题报告:luogu P1445

Bzoj2721 [Violet]樱花(筛法)

bzoj2721樱花——质因数分解

luogu P1445 [Violet]嘤F♂A

bzoj 2721[Violet 5]樱花 数论