CodeForces - 1228C(質因數分解+貢獻法)

題意

https://vjudge.net/problem/CodeForces-1228Chtml

首先先介紹一些涉及到的定義:ios

定義prime(x)表示x的質因子集合。舉例來講,prime(140)={2,5,7},prime(169)={13}。c++

定義g(x,p)表示存在一個最大的kN∗,使得x能夠被p^k整除,那麼g(x, p) = p^k。舉例來講:spa

  • g(45, 3) = 9 (45能夠被3^2 = 9整除可是不能被3^3=27整除)
  • g(63, 7) = 7 (63能夠被7^1 = 7整除可是不能被7^2=49整除)

定義f(x, y)表示全部g(y,p)  (pprime(x))的乘積,舉例來講:.net

  • f(30, 70) = g(70,2)·g(70,3)·g(70, 5) = 2^1·3^0·5^1 = 10
  • f(525,63) = g(63,3)·g(63,5)·g(63,7) = 3^2·5^0·7^1 = 63

如今給出兩個整數x和n,請計算出f(x,1)f(x,2)f(x,n) mod (10^9+7)的值。htm

思路

先算一下x=10,n=10的狀況blog

f(10,1)=1  f(10,2)=g(2,2)=2  f(10,3)=1  f(10,4)=g(4,2)=4  f(10,5)=g(5,5)=5ci

f(10,6)=g(6,2)=2  f(10,7)=1  f(10,8)=g(8,2)=8  f(10,9)=1  f(10,10)=g(10,5)=10get

容易發現,對於10的素因子二、5,2在二、四、六、八、10都出現了一次,在4,8又出現了一次,在8又出現了一次。因此對於素因子i,它的貢獻是x^(n/x) * x^(n/x/x) * x^(n/x/x/x) * ……it

因此對x質因數分解(分解到根號x便可),而後對每一個質因子算貢獻。

代碼

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int N=200005;
const int mod=1e9+7;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
ll qpow(ll a,ll b)
{
    ll res=1;
    while(b)
    {
        if(b&1) res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}
int main()
{
    std::ios::sync_with_stdio(false);
    ll x,n;
    cin>>x>>n;
    ll xx=x,gx=sqrt(x);
    ll ans=1;
    for(ll i=2; i<=gx; i++)
    {
        int f=0;
        if(xx==1)
            break;
        while(xx%i==0&&xx!=1)
        {
            xx/=i;
            f=1;
        }
        if(f)
        {
            ll nn=n;
            while(nn)
            {
                nn/=i;
                ans=ans*qpow(i,nn)%mod;
            }
        }
    }
    if(xx>1)
    {
        ll nn=n,i=xx;
        while(nn)
        {
            nn/=i;
            ans=ans*qpow(i,nn)%mod;
        }
    }
    cout<<ans<<endl;
    return 0;
}
相關文章
相關標籤/搜索