每日一题7.20
P1593 因子和 - 洛谷
题目描述
输入两个整数 a 和 b,求 ab 的因子和。
由于结果太大,只要输出它对 9901 取模的结果。
输入格式
仅一行,为两个整数 a 和 b。
输出格式
输出一行一个整数表示答案对 9901 取模的结果。
输入输出样例
输入 #1复制
2 3
输出 #1复制
15
说明/提示
数据规模与约定
对于全部的测试点,保证 1≤a≤5×107,0≤b≤5×107。
会发现,求因子和,比如2的3次方的因子就是1,2,2的平方,2的3次方。
是一个等比数列。
而a是由一个固定的质数组相乘得到的
因此算出每一个质数的等比数列并相乘就能得到答案。
除此之外,有大于a的平方根的数必定只有一次方。如26=2*13;还要考虑各种特殊情况,代码如下。
#include<bits/stdc++.h>
using namespace std;
#define mod 9901
int inv[9901];
void init()//初始化求逆元
{inv[0] = inv[1] = 1;for (int i = 2; i <= mod; i++)inv[i]=(mod-mod/i)*inv[mod%i]%mod;
}
int ksm(int a,int b)//快速幂
{int res=1;while (b){if(b&1)res=(res*a)%mod;a=(a*a)%mod;b>>=1;}return res;
}
int main()
{int n, m,res=1;init();cin >> n >> m;for (int i = 2; i <= sqrt(n); i++){if (!(n % i)){int mi = 0;while (n % i == 0){n/=i;mi++;}i %= mod;if(i==1)//特殊情况res=(res*(mi*m+1))%mod;elseres = (res * (ksm(i, mi*m + 1) - 1+mod)%mod * inv[i - 1])%mod;//求等比数列}}if (n>1){ n %= mod;if (n == 1)res = (res * (m + 1)) % mod;else if (n == 0)res *= 1;elseres=(res*(ksm(n,m+1)-1+mod)%mod*inv[n-1])%mod;}cout << res << endl;return 0;
}