Codeforces Round #209 (Div. 2) C. Prime Number【數論】

題目鏈接:http://codeforces.com/contest/359/problem/C

題意:給定n,xn,xa1,a2,,ana_1,a_2,\ldots,a_n,對表達式st=(1xa1+1xa2++1xan)\frac{s}{t}=(\frac{1}{x^{a_1}}+\frac{1}{x^{a_2}}+\ldots+\frac{1}{x^{a_n}})通分之後計算分子分母的gcdgcd%10000000071000000007

思路:要求分子分母gcd=xkgcd=x^k,令sum=a1+a2++ansum={a_1+a_2+\ldots+a_n},分母即爲xsumx^{sum},任一分子則爲xsumaix^{sum-a_i},主要在於處理分子部分,我們要求出所有分子的最大公約數,由於序列非降,所以取最後一項最小,但是可能存在係數爲xx的倍數情況,所以還需記錄一下相同項出現的次數。

所以每次取次數最小的tttt,判斷其係數(出現次數)aaaa是否能被xx整除,如果不行,則此時的tttt就是想要的指數,否則就將aax\frac{aa}{x}加到tt+1tt+1的係數上去,再循環上述操作。

AC代碼:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[100010];
const ll mod=1e9+7;
ll qpow(ll x,ll y,ll mo)
{
    ll ans=1;
    x%=mo;
    while(y){
        if(y&1){
            ans=ans*x%mo;
        }
        x=x*x%mo;
        y>>=1;
    }
    return ans;
}
ll sum=0;
map<ll,ll>mp;
int main()
{
    ll n,x;
    scanf("%lld%lld",&n,&x);
    mp.clear();
    for(int i=0;i<n;i++){
        scanf("%lld",&a[i]);
        mp[a[i]]++;
        sum=(sum+a[i]);
    }
    ll top=a[n-1];
    while(mp[top]%x==0&&top>=-1){
        mp[top-1]+=mp[top]/x;
        top--;
    }
    if(top<0){
        top=0;
    }
    ll tt=qpow(x,sum-top,mod);
    printf("%lld\n",tt);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章