2020多校联赛第四场B题:Basic Gcd Problem

2020多校联赛第四场B题:Basic Gcd Problem_第1张图片
质因数的定义:
每个合数都可以写成几个质数相乘的形式,这几个质数就都叫做这个合数的质因数. 如果一个质数是某个数的因数,那么就说这个质数是这个数的质因数. 就是一个数的约数,并且是质数,比如8=2 x 2 x 2, 2就是8的质因数;12=2 x 2 x 3, 2、3就是12的质因数。
题目大意:
输入T,存在T组用例,每组用例分别输入{ni,ci},根据题目所给函数:jiteu
得出相应的 f(x)。
我们来跑一下这个函数:ci=5,ni=10时,f(10) = max 5 * f(gcd(i,10)) = 5 * f(5) = 5 * max 5 * f(gcd(i,5)) = 5 * 5 * f(1) = 5 * 5 = 25;
ci=2,ni=16时,f(16) = max 2 * f(gcd(i,16)) = 2 * f(8) = 2 * max 2 * f(gcd(i,8)) = 2 * 2 * f(4) = 2 * 2 * max 2 * f(gcd(i,4)) = 2 * 2 * 2 * f(2) = 2 * 2 * 2 * 2 * f(1) = 2 * 2 * 2 * 2=16
最后的答案一定是输出的 c 的幂,需要做的就是确定这个幂的指数,这个指数就是x的质因数的个数。
质因数分解:
对于整数 n(n>1)
n = P1^a1 * P2^a2 * …………* (P1 < P2 < ……Pn);
P 为质数(素数)。

For (int i=2;i*i<=n;i++)
 {
	while(n%i==0)
 	{
		cnt++;///质因子的个数。
		n/=i;
	}
 }

因 为 ni,ci 最 大 值 为 1e6=(2*5)^6, 那 么 极 限 数 据 就 是 (1e6)^12%
(1e9+7),考虑到时间与精度问题我们这里使用快速幂取模。

#define ll long long
ll qpow(ll x, ll y, ll mod)
{
    Ll res =1;
    while(y)
    {
        if(y&1)
            res=(res*x)%mod;
        x=(x*x)%mod;
        y>>=1;
    }
    return(res+mod)%mod;
}

注:二进制的几个运算符& 和 >> :

“&”运算通常用于二进制取位操作,例如一个数 & 1 的结果就是取二进制的最末位。还可以判断奇偶,x&1 == 0为偶,x&1 == 1为奇。

”>>” 运算比较单纯,二进制去掉最后一位,移位操作,不断遍历b的二进制位。

AC代码:

#include 
using namespace std;
int mod = 1e9 + 7;
#define L long long
L pow(L x, L y, L mod)
{
    L res = 1;
    while (y)
    {
        if (y & 1)
            res = (res * x) % mod;
        x = (x * x) % mod;
        y >>= 1;
    }
    return (res + mod) % mod;
}
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    int t;
    cin >> t;
    while (t--)
    {
        int n, c, cnt = 0;
        cin >> n >> c;
        for (int i = 2; i * i <= n; i++)
        {
            while (n % i == 0)
            {
                cnt++;
                n /= i;
            }
        }
        if (n > 1)
            cnt++;
        int ans = pow(c, cnt, mod);
        cout << ans << endl;
    }
}

你可能感兴趣的:(2020多校联赛)