求一个数的所有因数的和
/*
给你一个数求出这个数的所有因数的和
这题没什么特别的
知道一个公式即可
假设这个数是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>
#include <algorithm>
#include <stdio.h>
#include <string>
#include <math.h>
#include <string.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;
}
求一个数的所有因数的和相关推荐
- 求一个数的所有因数+质因数分解【数论】
先附上所有因数的求法: 我的做法:是今天误打误撞写出来的: http://exam.upc.edu.cn/problem.php?id=5062 然后,我上网找居然没有人写一个高效一点的,我这个做法其 ...
- c语言怎么求一个数的所有因数,【代码】求一个数的因数和、求优化、顺便也供新人参考算法...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include main() { int n,q,p,m,k=1,sum=0,s[99999]={2},t[99999];//n是输入 ...
- 真约数求法 c语言,数学:求一个数的真约数(因数)的个数及所有约数之和
一. 我们知道,每个自然数(不包括0和1)都有2个以上的因数,因数最少的是质数(也叫素数),质数的因数是1和它本身.非质数的自然数也叫合数,它们都含有3个以上(含3个)的因数. 1.怎样求一个数有多少 ...
- 求一个数的所有因子(约数)
约数是指若整数a除以整数b(b≠0)除得的商正好是整数而没有余数,比如10的约数分别为1,2,5,10,这些数都能被10整除而没有余数,所以他们都是10的约数. 下面我们来看看约数如何求解 1.传统方 ...
- C++判断是否为素数、求一个数的因数、质因数分解
判断一个数是否为素数 #include<iostream> #include<vector> #include<math.h> #include<algori ...
- 求一个数的因数和或者是求因数
题意:就是求 数的因数和 不包括它本身的因数 #include<iostream> #include<cstring> #include<algorithm> #i ...
- python函数编程求三个数的最小公倍数_Python求三个数的最小公倍数
题目 求三个数的最小公倍数 思路 首先求两个数的最小公倍数,再求这个最小公倍数与第三个数的最小公倍数就是最终结果 有两种方案求两个数的最小公倍数 1. 分解质因数,也是短除法(在程序上差别不大) 循环 ...
- 求两个数的最大公因数
这里提供两种方法:一种比较朴素,基本思想很简单就是按照从大到小的找能够匹配的因数,找到就返回:另一种是欧几里得算法,该算法的核心思想是,当前两个数的最大公因数的也是这两个数模的与其中一个元素的的最大公 ...
- 百度web前端面试题之求两个数的最大公约数和最小公倍数
求两个数的最大公约数和最小公倍数,好像是第三题, 找到如下简洁写法: <1> 用辗转相除法求最大公约数 算法描述: m对n求余传给自己,再次求余, 若余数等于0 则 n 为最大公约数 &l ...
最新文章
- 2022-2028年中国体育用品行业投资分析及前景预测报告(全卷)
- Cocos Creator里cc.tween的stopAllActions() 和 repeatForever的用法
- kdd cup 2019
- xhtmlConformance mode=Legacy/ 致ajax失效
- mro python_用python实现MRO算法
- struct的成员对齐
- 函数指针也可作为函数的参数
- 【转】visual studio 2010失败或.net framework 4.0 0xc8000247错误解决
- 拆分:分解单块系统——《微服务设计》读书笔记
- 新手学习C语言编程的8个致命错误,你中招了吗?
- python类成员变量_Python 类变量和成员变量
- C++---两数之和
- 【转载】关于RabbitMQ的高可用性
- C++ 数据抽象 封装 接口
- note_pom.xml文件配置说明_note
- (21)Verilog HDL结构:task语句
- 隐形Euler方法的java程序_常微分方程的解法 (二): 欧拉(Euler)方法
- [转]关于Apple TV(take 2)及 iPhone 更新的相关内容
- 在过去的12个月(2016)里,你用到的最多的算法或方法是什么?
- java图书管理系统源代码_高校社团管理系统(ssm+mysql)