牛客寒假训练营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; }