今天咕了,然后刚刚队友问我防ak怎么说,就顺手写个题解吧。


题意:在所有1、2、3、5、9这5个数字组成的数中,求第 大的数。
知识点:进制转换
思路:由于m和n给的很小,因此可以先dp把所有的 预处理出来。然后 调用。
之后求第k大的数,其实可以看成5进制:1位数有5个,2位数有25个。。。依此类推。求出位数之后转化为5进制就ok了。
代码:

#include <bits/stdc++.h>
using namespace std;
long long c[311][311];
int mod=1e9+7;
int a[5]={1,2,3,5,9};
int main(){
    int i,j;
    for(i=0;i<=200;i++){
        for(j=0;j<=i;j++){
            if(j==0||i==j)c[i][j]=1;
            else c[i][j]=c[i-1][j]+c[i-1][j-1],c[i][j]%=mod;

        }
    }
    int t;
    cin>>t;
    while(t--){
        int m,n;
        cin>>m>>n;
        int cnt=c[m][n];
        int temp=5,p=1;
        while(temp<cnt)cnt-=temp,temp*=5,p++;
        int k=cnt-1;
        stack<int>s;
        while(p--)s.push(a[k%5]),k/=5;
        while(!s.empty())cout<<s.top(),s.pop();
        cout<<endl;
    }

}