vijosP1371 方程的解

vijosP1371 方程的解

 

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

 

【思路】

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

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

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

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

 

【代码】

 

 1 #include<iostream>
 2 using namespace std;
 3 
 4 typedef long long LL;
 5 struct Bign{
 6     int len,N[10001];
 7 };
 8 LL pow(int x) {
 9     LL tmp=x,ans=1;
10     while(x) {
11         if(x&1) ans=(ans*tmp)%1000;
12         tmp=(tmp*tmp)%1000;
13         x>>=1;
14     }
15     return ans;
16 }
17 
18 void multi(Bign& a,int x)
19 {
20     for(int j=0;j<a.len;j++) a.N[j] *= x;
21     int i=0;
22     while(i<a.len || a.N[i]>10) {
23         a.N[i+1] += a.N[i]/10;
24         a.N[i] %= 10;
25         i++;                    //i++
26     }
27     if(a.N[i]) a.len=i+1;  //判断
28     else a.len=i;
29 }
30 
31 void div(Bign& a,int x) {
32     for(int i=a.len-1;i>0;i--) {  //由高位到低位
33         a.N[i-1] += a.N[i]%x*10;
34         a.N[i] /= x;
35     }
36     a.N[0]/=x;  //最后一位
37     while(a.N[a.len-1]==0) a.len--;  //删除前导0
38 }
39 
40 int main() {
41     int k,x;
42     cin>>k>>x;
43     LL g=pow(x);  //x^x
44     g--;  k--;
45     Bign ans; ans.len=1,ans.N[0]=1;
46     for(int i=1;i<=k;i++) {
47         multi(ans,g-k+i);
48         div(ans,i);
49     }
50     for(int i=ans.len-1;i>=0;i--) cout<<ans.N[i];
51     return 0;
52 }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值