zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    手速太慢QAQ
    最短路总结
    放下
    素材收集
    NOI2018旅游记
    -5
    七月
    德国GG了
    本人自传
    bzoj2369
  • 原文地址:https://www.cnblogs.com/lidaxin/p/4876418.html
Copyright © 2011-2022 走看看