今天咕了,然后刚刚队友问我防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;
}
}

京公网安备 11010502036488号