Master of Phi HDU - 6265(数论)
Problem B. Master of Phi
You are given an integer n. Please output the answer of ∑ d|n φ(d) × n d modulo 998244353. n is represented in the form of factorization.
φ(n) is Euler’s totient function, and it is defined more formally as the number of integers k in the interval 1 ≤ k ≤ n for which the greatest common divisor gcd(n, k) is equal to 1.
For example, the totatives of n = 9 are the six numbers 1, 2, 4, 5, 7 and 8. They are all co-prime to 9, but the other three numbers in this interval, 3, 6, and 9 are not, because gcd(9, 3) = gcd(9, 6) = 3 and gcd(9, 9) = 9. Therefore, φ(9) = 6. As another example, φ(1) = 1 since for n = 1 the only integer in the interval from 1 to n is 1 itself, and gcd(1, 1) = 1.
And there are several formulas for computing φ(n), for example, Euler’s product formula states like:
φ(n) = n ∏ p|n ( 1 − 1 p ) ,
where the product is all the distinct prime numbers (p in the formula) dividing n.
Input
The first line contains an integer T (1 ≤ T ≤ 20) representing the number of test cases.
For each test case, the first line contains an integer m (1 ≤ m ≤ 20) is the number of prime factors. The following m lines each contains two integers pi and qi (2 ≤ pi ≤ 108 , 1 ≤ qi ≤ 108 ) describing that n contains the factor pi qi , in other words, n = ∏m i=1 pi qi . It is guaranteed that all pi are prime numbers and different from each other.
Output
For each test case, print the the answer modulo 998244353 in one line.
Example standard input standard output
2 15
2 168
2 1
3 1
2
2 2
3 2
Explanation
For first test case, n = 21 ∗3 1 = 6, and the answer is (φ(1)∗n/1+φ(2)∗n/2+φ(3)∗n/3+φ(6)∗n/6) mod 998244353 = (6 + 3 + 4 + 2) mod 998244353 = 15.
题意
计算∑ d|n φ(d) × n/d
#include<bits/stdc++.h>
using namespace std;
const long long mod = 998244353;
long long poww(long long a,long long b)
{
long long ans = 1;
while(b)
{
if(b&1)
{
ans = ans*a%mod;
}
a = a*a%mod;
b>>=1;
}
return ans;
}
long long mul(long long a, long long b)
{
long long ans = 0;
while(b)
{
if(b&1)
{
ans = ans+a%mod;
}
a = 2*a%mod;
b>>=1;
}
return ans;
}
int main()
{
long long i,j,m,n,t,p,q,ans;
scanf("%lld",&t);
while(t --)
{
scanf("%lld",&n);
ans = 1;
for(i = 0; i < n; i++)
{
scanf("%lld %lld",&p, &q);
ans = ans*poww(p,q-1ll)%mod;
ans = ((p+mul(p,q)-q)%mod)*ans%mod;
}
printf("%lld\n",ans);
}
return 0;
}