zoukankan      html  css  js  c++  java
  • 【xsy1143】 兔子的数字 搜索

    题目大意:请找到第$k$大的数,满足各位数字之和等于各位数字之积。其中$k≤10^{18}$。

    首先我们要确定这个第$k$大的数有多大

    我们用$f[i][j][he][ji]$表示我们要搜索一个$i$位的数字,还有$j$位没有确定,且确定的位总和为$i$,积为$j$的方案数。

    我们发现:若$he+j<ji$,则$f[i][j][he][ji]=0$(假设后面大量地补$1$,即只增加各位数字之和而不增加各位数字之积,如果积过大,那么显然这种方法并不奏效)

    若$he+j=ji$,则$f[i][j][he][ji]=inom{i}{j}$(这种情况下,余下的j位均为$1$恰好可以让和等于积,组合数的意义为将$j$个$1$插入到已经确定的i-j位数中)

    若$j=0$,那么显然只需要判一下和是否等于积即可。

    若在这三种情况外,直接枚举下一位数字($2$到$9$枚举)。

     

    我们设第$k$大的数字位数为$x$,每次计算$f[x][x][0][1]$,若$f[x][x][0][1]<n$,则$n-=f[x][x][0][1]$,并且$x++$,否则这个$x$即为第$k$大数的位数。

    接着从大到小枚举每一位,随后计算当该数前若干位确定时的方案数,借此逐位确定整个数

    时间复杂度为$O(??)$

     1 #include<bits/stdc++.h>
     2 #define L long long
     3 #define M 505
     4 using namespace std;
     5 L n,c[M][M]={0};
     6 
     7 L calc(int n,int m,int he,int ji){
     8     if(he+m<ji) return 0;
     9     if(!m) return he==ji;
    10     if(he+m==ji&&ji!=1) 
    11     return c[n][m];
    12     L cnt=0;
    13     for(int i=2;i<10;i++) 
    14     cnt+=calc(n,m-1,he+i,ji*i);
    15     return cnt;
    16 }
    17 
    18 int main(){
    19     cin>>n;
    20     for(int i=0;i<M;i++){
    21         c[i][0]=1;
    22         for(int j=1;j<=i;j++)
    23         c[i][j]=c[i-1][j]+c[i-1][j-1];
    24     }
    25     if(n<10){printf("%d
    ",n); return 0;}
    26     n--;
    27     int hh=1;
    28     while(1){
    29         L now=calc(hh,hh,0,1);
    30         if(now<n) n-=now,hh++;
    31         else break;    
    32     }
    33     int he=0,ji=1;
    34     for(int i=hh;i;i--){
    35         for(int j=1;j<10;j++){
    36             L now=calc(i-1,i-1,he+j,ji*j);
    37             if(now<n)n-=now;
    38             else{
    39                 printf("%d",j);
    40                 he+=j; ji*=j;
    41                 break;
    42             }
    43         }
    44     }
    45 }
  • 相关阅读:
    GoldenGate HANDLECOLLISIONS参数使用说明
    GoldenGate for bigdata 12.3.2.1版本新特性
    使用GoldenGate EVENTACTIONS执行数据的实时触发和定制化
    基于Docker的GoldenGate部署
    Redis热点数据预写方案
    Redis缓存和数据库双写一致方案
    Redis主从复制原理和高可用方案
    Redis的并发竞争如何解决?如何保证并发写的有序?
    Redis 的单线程模型
    Nginx系列之6:重要模块
  • 原文地址:https://www.cnblogs.com/xiefengze1/p/9728501.html
Copyright © 2011-2022 走看看