zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    PHP如何解决网站大流量与高并发的问题
    HTML CSS 特殊字符表
    PHP 把返回的数据集转换成Tree树
    网页加载时域名加载数量限制
    关于浮点型误差的解决方法
    MVC三层架构
    MyBatis
    plsql储存过程
    游标和触发器
    使用plsql编程
  • 原文地址:https://www.cnblogs.com/zsyzlzy/p/12373934.html
Copyright © 2011-2022 走看看