您的位置:首页 > 其它

vijosP1371 方程的解

2015-10-14 09:03 232 查看
vijosP1371 方程的解

链接:https://vijos.org/p/1371

【思路】

组合公式+快速幂+高精单精。

求x^x %1000:因为x最大为2^31-1所以用快速幂在O(logx)的时间内求解g。

安排剩下的k个数:C(g-1,k-1) 相当于把g个数划分到k个不可空的集合中的数目,依旧可以看作插挡板。

考虑这类题目我们可以先从简单情况入手写一个能够处理简单数据的代码,然后再考虑优化的问题。

【代码】

#include<iostream>
using namespace std;

typedef long long LL;
struct Bign{
int len,N[10001];
};
LL pow(int x) {
LL tmp=x,ans=1;
while(x) {
if(x&1) ans=(ans*tmp)%1000;
tmp=(tmp*tmp)%1000;
x>>=1;
}
return ans;
}

void multi(Bign& a,int x)
{
for(int j=0;j<a.len;j++) a.N[j] *= x;
int i=0;
while(i<a.len || a.N[i]>10) {
a.N[i+1] += a.N[i]/10;
a.N[i] %= 10;
i++;                    //i++
}
if(a.N[i]) a.len=i+1;  //判断
else a.len=i;
}

void div(Bign& a,int x) {
for(int i=a.len-1;i>0;i--) {  //由高位到低位
a.N[i-1] += a.N[i]%x*10;
a.N[i] /= x;
}
a.N[0]/=x;  //最后一位
while(a.N[a.len-1]==0) a.len--;  //删除前导0
}

int main() {
int k,x;
cin>>k>>x;
LL g=pow(x);  //x^x
g--;  k--;
Bign ans; ans.len=1,ans.N[0]=1;
for(int i=1;i<=k;i++) {
multi(ans,g-k+i);
div(ans,i);
}
for(int i=ans.len-1;i>=0;i--) cout<<ans.N[i];
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: