「一本通 6.2 练习 5」樱花

「一本通 6.2 练习 5」樱花

樱花.png

引理1:对于不定方程:a*b=c的解的个数,即为c的约数个数(易证,一一对应关系)

引理2: p在n!的幂次方为sigma k=1~+oo n/(p^k)

扯淡趣谈:求126!末尾有几个0?

转换为求126!分解质因数后有几个5
那不就可以用上面的引理2了嘛
floor(126/5)+floor(126/25)+floor(126/125)

/*
reference:
	
Date:
	2019.10.09
sol:
	
*/
#include<bits/stdc++.h>
using namespace std;
#define int long long
template <typename T>inline void rd(T &x){x=0;char c=getchar();int f=0;while(!isdigit(c)){f|=c=='-';c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}x=f?-x:x;}
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define dwn(i,a,b) for(int i=(a);i>=(b);--i)
#define mem(a,b) memset(a,b,sizeof(a))
#define ee(i,u) for(int i=head[u];i;i=e[i].next)

const int N =1e6+10,mod=1e9+7;
int n,tot_p;
int v[N],p[N];

int ans=1;

inline void shai(){
	rep(i,2,N){
		if(v[i]==0){
			v[i]=i;
			p[++tot_p]=i;
		}
		rep(j,1,tot_p){
			if(p[j]>v[i] || p[j]>N/i)break;
			v[i*p[j]]=p[j];
		}
	}
}

#undef int
int main(){
#define int long long
	#ifdef WIN32
	freopen("yinghua.txt","r",stdin);
	#endif
	rd(n);
	shai();
	for(int i=1;p[i]<=n;++i){
		int now=p[i];
		int cnt=0;
		while(now<=n){
			cnt+=n/now;
			now*=p[i];
		}
//		(ans*=(cnt<<1|1)%mod)%mod;//这种写法会爆,以后千万不能这样写了!!! 
		ans=(ans*(cnt<<1|1)%mod)%mod;
	}
	printf("%lld",ans);
	return 0;
}
原文地址:https://www.cnblogs.com/sjsjsj-minus-Si/p/11642316.html