2020牛客暑期多校训练营(第四场)B.Basic Gcd Problem(数学)

地址:https://ac.nowcoder.com/acm/contest/5669/B

 

 

 解析:

题意如此,主要是要先看懂这个公式。

由于是每次都是c*c*c...所以不用看c了,直接分解n

要想max最大,很明显需要尽量多次得分解n,那么每次找n的最大因子x,gcd(n,x)

举几个例子,计算方式根据上一句:

看一下分别都乘几次c

18->9->3->1  2*3^2  1+2=3

21->7->1  3*7  1+1=2

27->9->3->1   3^3  3

有结论,c乘多少次,取决于n的质因子有几个,所以边分解边乘即可:

#include<iostream>
#include<cstring>
#include<string.h>
#include<cmath>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
const int mod=1e9+7;
int a[maxn];
int qk(ll a, ll b,ll c)
{
    ll ans=1;
    a=a%c;
    while(b)
    {
        if(b%2==1)
            ans=(ans*a)%c;
        b=b/2;
        a=(a*a)%c;
    }
    return  ans;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,c;  //ll会超时
        scanf("%d%d",&n,&c);
        int cnt=0;
        ll sum=1;
        for(int i=2;i*i<=n;i++)
        {
            while(n%i==0)
            {
                n=n/i;
                sum=(sum%mod*c%mod)%mod;
            }  
        }  
        if(n!=1)
            sum=(sum*c)%mod;
        printf("%lld\n",sum);
    }

 

posted @ 2020-07-21 22:35  liyexin  阅读(132)  评论(0编辑  收藏  举报