牛客寒假训练营1E 求整数的因数个数与所有因数之和

 

   假设这个正数是n,质因数分解后可以写成
   n=a1^k1*a2^k2*……*ai^ki
    所求的数的因数和f(n)就等于
    f(n)=(1+a1+a1^2+……+a1^k1)*(1+a2+a2^2+……+a2^k2)*……*(1+ai+ai^2+……+ai^ki)
    然后根据等比数列求和
    f(n)=(a1^(k1+1)-1)/(a1-1)*(a2^(k2+1)-1)/(a2-1)*……*(ai^(ki+1)-1)/(ai-1)

#include<iostream>
typedef long long ll;
using namespace std;
ll countfactor(ll n)  
{
    ll sum=1;
    for(ll i=2;i*i<=n;i++)
    {
        ll cnt=0;
        while(n%i==0)
        {
            n/=i;
            cnt++;
        }
        sum*=(cnt+1);
    }
    if(n>1)
        sum*=2;
    return sum;
}
int main()
{
    ll n;
    scanf("%lld",&n);
    //printf("%lld\n",countfactor(n));
    ll ans=0;
    ll x;
    while(1){
        x=countfactor(n);
        ans++;
        if(x==2) break;
        else n=x;
    }
    printf("%lld\n",ans);
     
    return 0;
}

  

#include <bits/stdc++.h>
#define ll long long
#define mod 10000000033
#define MAX 40000
#define S 0
#define N 100
using namespace std;
ll p[MAX];
ll prime[MAX];
ll k;
void init(){  //打表出质数 
	k=1;
	memset(p,0,sizeof(p));
	for(int i=2; i<MAX; i++){
		if(!p[i]){
			for(int j=i+i; j<MAX; j+=i){
			p[j]++;
			 }
			prime[k]=i;
			k++;
		}
	}
}
ll quickpow(ll n,ll a){  //快速幂 
	ll ans=1;
	while(a>=1){
		if(a&1)
		ans=n*ans;
		a=a>>1;
		n=n*n;
	}
	return ans;
}
ll pr[MAX];  //当前数的质因子 
ll num[MAX]; //当前数的质因子次方 
int main()
{
	init();
	int t;
	cin>>t;
	while(t--){
		ll n;
		scanf("%lld",&n);
		if(n==0){
			printf("0\n");
			continue;
		}
		memset(pr,0,sizeof(pr));
		memset(num,0,sizeof(num));
		ll cnt=1;
		for(ll i=1; i<=k-1; i++){
			if(prime[i]>n)
			break;
			if(n%prime[i]==0){
				pr[cnt]=prime[i];
				while(1){
					n/=prime[i];
					num[cnt]++;
					if(n%prime[i]!=0)
					break;
				}
				 cnt++;
			}
		}
		pr[cnt]=n;
		num[cnt]=1;
		ll ans=1;
		for(int i=1; i<=cnt; i++){
			if(pr[i]==1)
			continue;
			ans*=(pow(pr[i],num[i]+1)-1)/(pr[i]-1);
		}
		printf("%lld\n",ans);
	}
	return 0;
}

  

posted @ 2020-02-05 14:48  杰瑞与汤姆  阅读(285)  评论(0编辑  收藏  举报