约数之和,

给定 nn 个正整数 aiai,请你输出这些数的乘积的约数之和,答案对 109+7109+7 取模。

输入格式

第一行包含整数 nn。

接下来 nn 行,每行包含一个整数 aiai。

输出格式

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

数据范围

1≤n≤1001≤n≤100,
1≤ai≤2×1091≤ai≤2×109

输入样例:
3
2
6
8
输出样例:
252
#include <iostream>
#include <unordered_map>
const int N=110;
const int mod=1e9+7;

using namespace std;
typedef long long ll;
unordered_map<int,int>primes;
void fun(int n)
{
    for(int i=2;i<=n/i;i++)
    {
        while(n%i==0)
        {
            n/=i;
            primes[i]++;
        }
    }
    if(n>1) primes[n]++;
}
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        int x;
        cin>>x;
        fun(x);
    }
    ll res=1;
    for(auto &t:primes)
    {
        int a=t.first,b=t.second;
        ll ans=1;
        while(b--)    ans=(ans*a+1)%mod;
        res=(res*ans)%mod;
        
    }
    cout<<res;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内容简介: 本书论述了算法数论的基本内容,其中包括:连分数、代数数域、椭圆曲线、素性检验、大整数因子分解算法、椭圆曲线上的离散对数、超椭圆曲线。本书的特点是内容涉及面广,在有限的篇幅内,包含了必要的预备知识和数学证明,尽可能形成一个完整的体系。并且本书的部分内容曾多次在中国科学院研究生院信息安全国家重点实验室和广州大学作为硕士研究生教材使用。本书可作为信息安全、数论等专业的研究生教材及相关专业的研究人员、高等学校的教师和高年级学生的参考。 目录: 序 前言 第一章 整数的因子分解 1.1 唯一分解定理 1.2 辗转相除法(欧氏除法) 1.3 Mersenne素数和Fermat素数 1.4 整系数多项式 1.5 环Z和Z[ω] 习题一 第二章 同余式 2.1 孙子定理 2.2 剩余类环 2.3 Euler函数ρ(m) 2.4 同余方程 2.5 原根 2.6 缩系的构造 习题二 第三章 二次剩余 3.1 定义及Euler判别条件 3.2 Legendre符号 3.3 Jacobi符号 习题三 第四章 特征 4.1 剩余系的表示 4.2 特征 4.3 原特征 4.4 特征和 4.5 Gauss和 习题四 第五章 连分数 5.1 简单连分数 5.2 用连分数表实数 5.3 最佳渐近分数 5.4 Legendre判别条件 习题五 第六章 代数数域 6.1 代数整数 6.2 Dedekind整环 6.3 阶的一些性质 第七章 椭圆曲线 7.1 椭圆曲线的群结构 7.2 除子类群 7.3 同种映射 7.4 Tate模和Weil对 7.5 有限域上的椭圆曲线 习题七 第八章 在密码学中的一些应用 8.1 RSA公钥密码 8.2 Uiffie-Hellman体制 8.3 ElGamal算法 8.4 基于背包问题的公钥密码 8.5 秘密共享 第九章 素性检验 9.1 Fermat小定理及伪素数 9.2 强伪素数及Miller-Rabin检验 9.3 利用n-1的因子分解的素性检验 9.4 利用n+1的因子分解的素性检验 9.5 分圆环素性检验 9.6 基于椭圆曲线的素性检验 第十章 大整数因子分解算法 10.1 连分数因子分解算法 10.2 二次筛法 10.3 Pollard的P-1因子分解算法 10.4 椭圆曲线因子分解算法 10.5 数域筛法 习题十 第十一章 椭圆曲线上的离散对数 11.1 椭圆曲线公钥密码 11.2 小步-大步法 11.3 家袋鼠和野袋鼠 11.4 MOV约化 11.5 FR约化 11.6 SSSA约化 11.7 有限域上离散对数的计算 第十二章 超椭圆曲线 12.1 超椭圆曲线的Jacobian 12.2 虚二次代数函数域 12.3 基于超椭圆曲线的公钥密码 附录 一些常用算法 A.1 不可约多项式的判别 A.2 有限域中平方根的求解 A.3 有限域上的分解 A.4 Hensel引理 A.5 格 A.6 Z[x]中多项式的分解 参考文献 免责申明:此书是我在网络上获取的,希望对大家有用。资源版权归作者及其公司所有,如果你喜欢,请购买正版。~~~
### 回答1: 题目描述: 编程读入两个正整数a,b,输出[a,b]区间内的所有亲和数对。亲和数对的含义是一对整数m和n,满足m的真约数之和等于n,同时n的真约数之和等于m。 解题思路: 首先,我们需要一个函数来求一个数的所有真约数之和。然后,我们可以遍历[a,b]区间内的所有数,对于每个数m,我们可以计算出其真约数之和sum_m,然后再遍历[a,b]区间内的所有数n,对于每个数n,我们可以计算出其真约数之和sum_n,如果sum_m等于n且sum_n等于m,则(m,n)是一个亲和数对,输出即可。 需要注意的是,题目中给出的数据范围是1≤a≤b≤10000,因此我们需要对每个数都计算其真约数之和,时间复杂度为O(n^2),可能会超时。因此,我们可以使用一个数组来记录每个数的真约数之和,这样可以将时间复杂度降为O(n)。 代码实现: ### 回答2: 什么是亲和数对? 亲和数对是指一对整数m和n,满足m的真约数之和等于n,同时n的真约数之和等于m。例如:220和284是一对亲和数对,因为220的真约数之和为284,284的真约数之和为220。 如何解决编程问题? 对于此问题,可以设置两个循环i和j来遍历[a,b]区间内的所有数对。在循环中,我们需要找出数i的所有真约数之和以及数j的所有真约数之和,并进行比较。如果这两个数相等,就说明它们是一对亲和数。 下面是代码示例: ```python def get_divisors_sum(num): """ 计算num的所有真约数之和 """ divisors_sum = 1 for i in range(2, int(num ** 0.5) + 1): if num % i == 0: divisors_sum += i if num // i != i: divisors_sum += num // i return divisors_sum a, b = map(int, input().split()) for i in range(a, b+1): for j in range(i+1, b+1): if get_divisors_sum(i) == j and get_divisors_sum(j) == i: print(i, j) ``` 需要注意的是,由于题目中给定的数据范围比较大 [1,2e6],因此在计算真约数之和时,应该使用优化的算法。上面的代码示例中,我们使用了较为高效的方法来计算真约数之和。 ### 回答3: 首先,我们需要明确什么是真约数。一个正整数的真约数是指除了它本身以外的所有因数。比如,6的真约数为1、2、3。 接下来,我们需要找出[a,b]区间内所有的亲和数对。我们可以用一个双重循环来枚举区间内的每一个数对,对于每个数对(m,n),我们需要分别求出它们的真约数和sum1和sum2,再判断是否满足亲和数对的条件。 具体地,我们可以使用一个函数get_div_sum(num)来获取一个数num的真约数之和。它的实现方式是将num从2到sqrt(num)的每一个因数加入sum中,并将num/i也加入sum中,最后再加上1(因为1是所有数的真约数),即为num的真约数之和。 下面是完整的代码实现: def get_div_sum(num): sum = 1 for i in range(2, int(num**0.5) + 1): if num % i == 0: sum += i + num // i if int(num**0.5)**2 == num: sum -= int(num**0.5) return sum a, b = map(int, input().split()) cnt = 0 for m in range(a, b + 1): n = get_div_sum(m) if m < n and get_div_sum(n) == m: print("{} {}".format(m, n)) cnt += 1 if cnt == 0: print("NONE") 注意,在循环枚举时,我们只需要对m<n的数对进行判断,因为m=n时显然不满足亲和数对的条件。另外,需要特别处理m=n的情况,因为此时如果判断成立,会输出重复的数对,在这里我们只输出一次就好了。 最后,注意输出样例中给出的数据范围,保证输入的参数都在合法范围内才能进行计算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值