欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Master of Phi HDU - 6265(数论)

程序员文章站 2022-04-27 13:17:55
...

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


 Master of Phi HDU - 6265(数论)

#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;
}