• 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 }
  • 相关阅读:
    Maximal Square
    Count Complete Tree Nodes
    Rectangle Area
    Implement Stack using Queues
    Basic Calculator
    Invert Binary Tree
    Summary Ranges
    Basic Calculator II
    Majority Element II
    Kth Smallest Element in a BST
  • 原文地址:https://www.cnblogs.com/lidaxin/p/4876418.html
Copyright © 2020-2023  润新知