1 条题解
-
0
求约数和和约数个数
对于:
此时约数个数为:
此时的约数之和为:$(p1^0+p1^1+...p1^{c1}) * ...*(pk^0+pk^1+...+pk^{ck})$ 那么求约数之和就可以转变为:
while(b--){ t=(t*p+1)%mod; }即通过迭代法求约数和(也可以用等比数列的求和公式求,涉及到逆元的知识),即:
核心代码如下:const int mod = 1e9 + 7; const int N = 200; int n; int a[N]; map<int, int> mp;// void decompose(int num) { for (int i = 2; i * i <= num; i++) { while (num % i == 0) { num /= i; mp[i]++; } } if (num > 1) mp[num]++; } int divsum(){ int res=1; for (map<int, int>::iterator it = mp.begin(); it != mp.end(); it++) { int a = it->first, b = it->second; int t = 1; while (b--) { t = (t * a + 1) % mod; } res = res * t % mod; } return res; } /*若要求约数个数: ans=1; for (map<int, int>::iterator it = mp.begin(); it != mp.end(); it++){ int a = it->first, b = it->second; ans*=(b+1); } return ans; */
信息
- ID
- 43
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 5
- 已通过
- 3
- 上传者