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;
    }
    
  • 相关阅读:
    Android游戏音效实现
    对Android体系结构的理解--后续会补充
    实现软件版本新特性的具体步奏
    搜索栏的自定义
    有关导航栏的相关认识
    自定义tabBar中的注意事项
    多控制器的管理
    ios中创建控制器的几种方式
    利用高德地图官方提供的API实现模拟定位的功能
    IOS中利用NSKeyedArchiver进行数据的归档和恢复
  • 原文地址:https://www.cnblogs.com/zsyzlzy/p/12373934.html
Copyright © 2011-2022 走看看