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