题目传送门
题意:
n个数,第i个数是 。一个素数x。
表示n个分数之和,即 。
把n个分数之和表示为 的形式,其中 。
计算 。
题解:
, 其中 。
你可以整理成 , 其中m不是x的倍数。
你可以把分子看成是一个多项式,按照幂次从低到高去整理系数,如果系数不能整除x,那么你找到了y。
用map去整理系数方便一些,一直处理map的首元素,map的第一关键字表示幂次,第二关键字表示系数。
答案是 ,快速幂计算。
感受:
写好后,直接编译成功,直接AC。太少见了。
代码:
#include<bits/stdc++.h>
using namespace std ;
typedef long long ll ;
typedef pair<int , int> pii ;
const int maxn = 1e5 + 5 ;
const ll mod = 1e9 + 7 ;
int n ;
ll x , a[maxn] , s = 0 ;
map<ll , ll> num ;
ll qpow(ll a , ll b)
{
ll ans = 1 ;
while(b)
{
if(b & 1)
ans = (ans * a) % mod ;
b >>= 1 ;
a = (a * a) % mod ;
}
return ans % mod ;
}
void solve()
{
ll ans = 0 ;
while(1)
{
ll y = (*num.begin()).first ;
ll z = num[y] ;
if(z % x != 0){ans = y ; break ;}
num.erase(y) ;
while(z % x == 0)
{
z /= x ;
y ++ ;
}
num[y] += z ;
}
ans = min(ans , s) ;
printf("%lld\n" , qpow(x , ans)) ;
}
int main()
{
scanf("%d%lld" , &n , &x) ;
for(int i = 1 ; i <= n ; i ++) scanf("%lld" , &a[i]) , s += a[i] ;
for(int i = 1 ; i <= n ; i ++) num[s - a[i]] ++ ;
solve() ;
return 0 ;
}