$\color{green}{<–画图不易,点下这里赞一下吧}$
思路
一个数的约数是由这个数的几个质因子相乘得到的。
例如:12 的质因子有 2,3。12的约数有:1,2,3,4,6,12。
- 约数1 是由 0 个 2, 0 个3相乘得到的。
- 约数2 是由 1 个 2, 0 个3相乘得到的。
- 约数3 是由 0 个 2, 1 个3相乘得到的。
- 约数4 是由 2 个 2, 0 个3相乘得到的。
- 约数6 是由 1 个 2, 1 个3相乘得到的。
- 约数12 是由 2 个 2, 1 个3相乘得到的。
12 可以分解为:2^2*3^1。所以2可以取 0 ~ 2个,3种取法。3可以取 0~1 个,2种取法。12的约数一共:2 * 3 = 6个。
也就是:把一个数N 写成:N = (p1^x1^)(p^x2)(p3^x3)…(pk^xk),其中pi为质数。则N的约数个数为:(x1+1)(x2+1)(x3+1)…(xk+1)
理论点的证明
写了也没人看。
代码
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;
const int mod = 1e9+7 ;
int main()
{
int T;
cin >> T;
unordered_map<int, int> h;
while(T--)
{
int n; cin >> n;
//依次求出指数
for(int i = 2; i <= n / i; i++)
{
while(n % i == 0)
{
//指数+1
h[i] ++;
n = n / i;
}
}
//如果有剩余,也是一个质因子
if(n > 1) h[n]++;
}
long long res = 1;
for(auto iter = h.begin(); iter != h.end(); iter++)
{
//res = (x1+1)(x2+1)(x3+1)…(xk+1)
res = res * (iter->second + 1) % mod ;
}
cout << res;
}
学算法,就看海绵宝宝题解🧽
12的约数个数是6个,不是质因子啦
已更新
就凭你这句写了也没人看必须顶你
hhhhh
有没有很多人都在等着看你的题解
佬,这里的res为啥每次计算的时候都要取模,res算出来再取模行么orz
中间过程可能暴
收到,大佬
数学证明要是可以的话,还是希望大佬能够写一下,可能大佬的一个公式,能给萌新带来意向不到的收获。
《写了也没人看》🤓
呜呜呜,绵哥!!!
N = (p1^x1^)(p^x2)(p3^x3)…(pk^xk)这里面的p1和x1都指的啥啊 看不懂 有佬解释一下吗
p1是第一个质因数,x1是质因数最大可能是多少,比如12的第一个质因数为2,他最大出现次数为2
明白了 感谢!!!
大佬牛
数学证明:写了也没人看,hhh
hao
感谢
12的约数的个数是6个!!!!
已更新
iter->second + 1
这是什么意思?
哈希映射在哪里了,没看出来,求大佬解惑
iter->second是哈希表iter存储的某个约数出现的次数,+1是因为res = (x1+1)(x2+1)(x3+1)…(xk+1),可以看y总课回顾一下,比如2出现5次,那么对于2有六种选用方法,可以不用0次,也可以用1,2,3,4,5次
海绵宝宝yyds
海绵宝宝,每次先点,情有独钟~
海绵宝宝持续关注
大佬牛,醍醐灌顶,以后认准海绵宝宝