luogu UVA13279 Divisors

数论中因数个数函数或者说是d(n)是个非常有趣的函数。它的意思是某个数正因数的个数。比如d(24)=8因为24有8个正因数:1,2,3,4,6,8,12和24。而数学中一个正整数n的阶乘表示为n!并且定义如下
n!=123…n 另一个有趣的函数AF(n)(Again Factorial的缩写)定义如下
AF(n)= 1!2!3!..*n! 给你一个n,你要做的就是算出d(AF(n))的值。
输入格式: 输入包括了最多101行的数据,每一行都有一个整数n(0<n<5000001)。输入以一个0结束,不用计算这个值。
输出格式: 每行输入产生一个输出,这个输出为d(AF(n))%100000007(10^8+7)的值。

这里要用到类似阶乘分解的思想,同时运用了等差数列的求和公式。
思路:
1.线性筛。
2.一个质数的指数。
3.利用约数和公式求解。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
ll ans;
const int mod=1e8+7;
const int N=5e6+10;
int prime[350000],tot,n;bool v[N];
void get_prime()
{
	for(int i=2;i<N;i++)
	{
		if(!v[i])prime[++tot]=i;
		for(int j=1;i*prime[j]<N;j++)
		{
			v[i*prime[j]]=1;
			if(i%prime[j]==0)break;
		}
	}
}
int main()
{
	get_prime();
	while(scanf("%d",&n),n!=0)
	{
		ans=1;
		int t=n<<1;
		for(int i=1,j,l=22;prime[i]<=n;i++)
		{
			int x=prime[i],w,y,z=1;
			for(j=1;j<=l;j++)
			{
				if(x>n)break;
				w=n/x;
				y=w*x;
				z+=((t-x-y+2)*w)>>1;z%=mod;
				x*=prime[i];
			}
			if(j<l)l=j;
			ans*=z;ans%=mod;
		}
		printf("%lld
",ans);
	}
	return 0;
}
原文地址:https://www.cnblogs.com/zsyzlzy/p/12373934.html