您的位置:首页 > 其它

Codeforces_359C_Prime Number

2013-11-03 17:27 363 查看
题型:数论

题意:

先有n个数a1, a2, ..., an和一个质数x,代进式子

得到



t=xa1 + a2 + ... + an

求出s和t的GCD。

分析:

先粘一个tiankonguse的分析。

奇葩的数论题,主要要找出因子的结构,然后找出gcd应该是x的几次方。

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define MOD 1000000007LL
#define ll __int64
using namespace std;
ll a[123456],n,x,sum;

ll mult_mod(ll a,ll b,ll c) {
a%=c;
b%=c;
ll ret=0;
while(b) {
if(b&1) {
ret+=a;
ret%=c;
}
a<<=1;
if(a>=c)  a%=c;
b>>=1;
}
return ret;
}
//¼ÆËã x^n %c
ll pow_mod(ll x,ll n,ll mod) {
if(n==1)  return x%mod;
x%=mod;
ll tmp=x;
ll ret=1;
if (n == 0) return ret;
while(n) {
if(n&1)
ret=mult_mod(ret,tmp,mod);
tmp=mult_mod(tmp,tmp,mod);
n>>=1;
}
return ret;
}

bool cmp(ll a,ll b) {
return a>b;
}

int main() {
while(~scanf("%I64d%I64d",&n,&x)) {
sum=0;
for(int i=0; i<n; i++) {
scanf("%I64d",&a[i]);
sum+=a[i];
}
for(int i=0; i<n; i++) {
a[i]=sum-a[i];
}
sort(a,a+n,cmp);
ll top=n-1;
while(1) {
ll v=a[top];
ll cnt=0;
while(top>=0 && v==a[top]) {
top--;
cnt++;
}
if(cnt%x) {
v = sum<v ? sum : v;
printf("%I64d\n",pow_mod(x,v,MOD));
break;
}
cnt/=x;
for(int i=0; i<cnt; i++) {
top++;
a[top]=v+1;
}
}
}
return 0;
}
/*
2 2
2 2
3 3
1 2 3
2 2
29 29
4 5
0 0 0 0
26 2
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: