Divisors of the Divisors of an Integer(唯一分解定理+数理乘法原理)

在这里插入图片描述
这道题应该容易想到唯一分解定理吧(:
题意d(n)是求出[1,n]中为n的因子的个数;
但是sndd(n)又是求n的因子有哪些,并且把他的每个因子给d(n的因子)一下;
然后求和;
这道题看起来就是数论题;
然后我就想到了唯一分解定理;
因为一个数可以被分解为:
在这里插入图片描述
其中pi为素数,这个可以打表解决;
然后由数论知识可知道x的因子个数有:
在这里插入图片描述
,这个多个;
所以这大概就是唯一分解定理的知识了;
所以我可以假设n!为:
在这里插入图片描述
那么他对应的其中一个因子我可以假设为:
在这里插入图片描述
那么要求这个因子的因子个数:
就有:
在这里插入图片描述
因为(a1+1)属于[0+1,c1];一共c1+1项;
所以由乘法原理我可以知道,他的所有因子的个数为:
在这里插入图片描述
上面的种是由等差数列求和公式算出来的;
所以总得总数就是 连乘了;
也就是:
在这里插入图片描述
然后问题来了;我需要知道ci是多少;
根据上面的公式ci是由n!来的;所以怎么算n!有pi的因子多少个呢?
如果你写过n!结果中尾部有多少个0的问题,你就肯定知道怎么算了;
如果要你算n!中有多少个因子x,那么结果就是n/x的累加这就是一个 数论的结论;
直到n==0,就结束循环
所以AC代码:

#include<bits/stdc++.h>
using namespace std;
#define MAX 1000000//求MAX范围内的素数
typedef long long ll;
const ll Mod=10000000+7;
#define N 1000000
ll h=0;
bool p[N];
ll prime[N];
void db()
{//打表
	memset(p,true,sizeof(p));
	for(ll i=2;i<N;i++)
	{
		if(p[i]==true)
		{
			prime[h++]=i;
		}
		for(ll j=0;j<h&&i*prime[j]<N;j++)
		{
			p[i*prime[j]]=false;
			if(i%prime[j]==0)  break;
		}
	}
}
ll getnum(ll n,ll x){//求在n!中含有因子x的个数
  ll res=0;
  while(n){
     res+=n/x;
     n/=x;
  }
  return res;
}
int main(){
     db();
 
       ll n;
	   while(cin>>n){
		   if(n==0)break;
       ll ans=1;
       for(ll i=0;prime[i]<=n;i++){
            ll t=getnum(n,prime[i]);
            ans=ans%Mod*(t+1)*(t+2)/2%Mod;//这里居然不用费马小定理也能过(:
       }
       cout<<ans<<endl;
     }
    return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值