当前位置: 首页 > news >正文

数论经典问题——约数之和

给定 n个正整数 ai,请你输出这些数的乘积的约数之和,答案对 1e9+7取模

第一行包含整数 n。

接下来 n 行,每行包含一个整数 ai。

输出格式

输出一个整数,表示所给正整数的乘积的约数之和,答案需对 1e9+7取模。

数据范围

1≤n≤100
1≤ai≤2×1e9

输入样例:
3
2
6
8
输出样例:
252

根据算数基本定理,一个合数可以分解成质数的乘积

形如:x = p1^a1*p2^a2.....*pk^ak;

其中,pk为x的质因子,ak为质因子的指数

则根据乘法原理,可以看出此合数的约数个数共有(a1+1)*(a2+1)....*(ak+1)

约数之和则有(p1^0+p1^1....+p1^a1)*(p2^0+p2^1....+p2^a2)....*(pk^0+pk^1...+pk^ak)

#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;const int N = 110;
typedef long long LL;int main(void)
{int t;cin >> t;// 建立一个哈希表用来存储质因子的指数 unordered_map<int,int> primes;while(t--){int x;cin >> x;for(int i=2;i<=x/i;i++){// 使用试除法得出每一个质因子的指数 if(x%i==0) primes[i]++;}if(x>1) primes[x]++;}LL res= 1;for(auto prime:primes){int p = prime.first,a = prime.second;LL t = 1;// 当t=1时,原式=p+1;// 当t=2时,原式=p^2+p+1;// 这一步是为了得出括号中的每一项 while(a--) t = (t*p+1)%MOD;// 最后将这些所有项全部乘起来 res = res*t%MOD;}cout << res <<endl;return 0;
}

希望对你有所帮助!


http://www.mrgr.cn/news/13157.html

相关文章:

  • 超分中的GAN总结:常用的判别器类型和GAN loss类型
  • 【Linux篇】环境变量
  • Android Audio音量——硬按键调节音量(七)
  • 开学季 小学学科资源免费取 让你节省2W元报班费
  • 【计算机系统架构】从0开始构建一台现代计算机|时序逻辑、主存储器|第3章
  • Spring-2- AOP 切面编程
  • MySql中常用的sql语句大全(工作常用篇)
  • unicode编码存在转义字符,导致乱码问题的解决方案
  • 【XML详解】
  • 获取文件属性/库Lib
  • 力扣: 删除链表的倒数第N个元素
  • MySQL编译安装-麒麟V10 x86
  • TCP+UDP通信
  • P10916 椰子
  • Java基础(包装类)
  • python 使用宝塔面板在云服务器上搭建 flask
  • 【mysql】mysql之索引学习
  • 离散数学中的逻辑应用(2)
  • FFmpeg的入门实践系列四(AVS)
  • leetcode322:零钱兑换