Divisors of the Divisors of An Integer

Divisors of the Divisors of An Integer

链接:http://codeforces.com/gym/102040

时限:3000ms 空间:1024MB

题意:

d(n) 是n 的约数个数
sndd(n) 是n 约数的约数个数
题目给了个n,要求sndd( n! )

思路:

质因数分解;若一个数 k=p1 ^ c1 * p2 ^ c2 * p3 ^ c3 + …
其约数个数为 (1+c1) * (1+c2) * (1+c3)*…
假设n!=p1 ^ c1 * p2 ^ c2 * p3 ^ c3 + …
则任意一个数 m=p1 ^ a1 * p2 ^ a2 * p3 ^ a3 + … ( 0<=a1<=c1 , 0<=a2<=c2,0<=a3<=c3,…)
均为 n! 的约数
所以sndd(n!) = ∑ a 1 = 0 , a 2 = 0 , a 3 = 0 , . . . c 1 , c 2 , c 3 , . . . \sum_{a1=0,a2=0,a3=0,...}^{c1,c2,c3,...} a1=0,a2=0,a3=0,...c1,c2,c3,...(1+ a1) * (1+a2) * (1+a3) *…
合并化简一下(或者从考虑每个ai 的贡献看)
sndd(n!) = ∏ \prod ( 1 + c i ) ∗ ( 2 + c i ) 2 \frac{(1+ci ) * (2+ci ) }{ 2} 2(1+ci)(2+ci)

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+10;
const int Mod=1e7+7;
int prime[N];
bool is_prime[N];
ll Ans,c;
void sieve(int n)
{
    int p=0;
    for(int i=0; i<=n; i++)
    {
        is_prime[i]=true;
    }
    is_prime[0]=is_prime[1]=false;
    for(int i=1; i<=n; i++)
    {
        if(is_prime[i])
        {
            prime[p++]=i;
            for(int j=i*2; j<=n; j+=i)
            {
                is_prime[j]=false;
            }
        }
    }
}
ll get(int n, int p)
{
    ll s = 0;
    while (n)
        s += n / p, n /= p;
    return s;
}
int main()
{
    sieve(1000005);
    int n;
    while(~scanf("%d",&n)&&n)
    {
        Ans=1;
        for(int i=0; prime[i]<=n; i++)
        {
            c=get(n,prime[i]);
            Ans=( ((1+c)*(2+c)/2)%Mod )*Ans%Mod;
        }
        printf("%I64d\n",Ans);
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值