这道题应该容易想到唯一分解定理吧(:
题意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;
}