【题解】UVA13131 题解
UVA13131 题解
思路分析
这题首先我们要知道一个结论:若 ,则 。
简单证明一下,设 ( 为正整数),则 。显然 是 的因数,所以得证。
根据这个结论,我们枚举因数枚举到 时就可以了。题目要求不是 的倍数的 的因数之和。这里提供一种反向思路:计算所有 的因数和 的倍数的 的因数并分别求和,然后做差即可求得和。注意要特判平方数,不能计算重复。
关键代码
void solve(int n, int k)
{
int sum = 0, ks = 0;
for(int i = 1;i * i <= n;i++) //枚举因数
{
if(i * i == n)//n 是完全平方数且平方根为 i
{
sum += i;//因数之和
if(i % k == 0) ks += i;//k 的倍数的因数之和
}
else if(n % i == 0)
{
sum += i;
sum += (n / i);//因数之和
if(i % k == 0) ks += i;
if((n / i) % k == 0) ks += (n / i);//k 的倍数的因数之和
}
}
cout << sum - ks << endl;
}

浙公网安备 33010602011771号