2081、k镜像数组的和
题目:
2<=k<=9 1<=n<=30
解答:
题目不难,但是比较复杂。首先缺人不能用遍历所有十进制数,判断其是否为10和k进制数的方法,时间必超;因此选择构造10进制回文数,判断其是否为k进制回文数
先编写函数解决一些工具性的问题。
计算k进制回文数
bool k_p_num(long long num,int k){if(num%k==0) return false;//判断是否满足k回文long long numtemp=num;long long p_num=0;while(num){p_num=p_num*k+num%k;num=num/k;}if(numtemp==p_num)return true;else return false;
}
构造十进制回文数
//构造n位的十进制回文数
long long p_num(long long num){//求十进制回文long long p_num = 0;while(num){p_num=p_num*10+num%10;num=num/10;}return p_num;
}
构造n位的数字,所有可能的10进制回文数,并判断其是否为k进制回文数
参数:n为当前构造的数字位数;rem_n为题目中的n的余量,即n-([1,n-1]所构造的满足十进制、k进制回文数的个数);k为进制
分n=1,n为非1奇数,n为偶数三种情况。
回文数左右对称,只需要遍历左边一串即可。奇数情况下还要考虑中间的数的情况。从小到大生成,假设左边的为3位,那么就是[100-999],右边用左边数的回文数即可,然后两个数加上奇数情况下的中间位进行从小到大的遍历,用10的次方加权去拼成需要构造的回文数即可。
//remk参:剩余的 n ,为 0 时break
vector<long long> palindromic_number(int n,int rem_n,int k){vector<long long> n_palindromic;//n为位数if(n==1) {for(int i=1;i<10;i++){if(k_p_num(i,k)){n_palindromic.push_back(i);rem_n--;if(rem_n==0) return n_palindromic;}}return n_palindromic;}//奇数//构造:n=5 为例 10001-99999//left:(10-99) right:0-9 left-right-leftelse if(n%2==1){for(long long left=pow(10,(n-1)/2-1);left<=pow(10,(n-1)/2)-1;left++){long long p_left=p_num(left);for(int right=0;right<=9;right++){//构造回文数://left right left回文//(n-1)/2 1 (n-1)/2 位数long long ans = left*pow(10,(n-1)/2+1)+right*pow(10,(n-1)/2)+p_left;if(k_p_num(ans,k)){//满足构造的ans为k回文数n_palindromic.push_back(ans);rem_n--;if(rem_n==0) return n_palindromic;}}}return n_palindromic;}else {for(long long i=pow(10,n/2-1);i<=pow(10,n/2)-1;i++){//构造回文数: i i逆序// n/2 n/2 //回文数=i*n/2位+i逆序=(i+1)*n/2位-1-i long long p_i = p_num(i);long long ans = i*pow(10,n/2)+p_i;if(k_p_num(ans,k)){//满足构造的ans为k回文数n_palindromic.push_back(ans);rem_n--;if(rem_n==0) return n_palindromic;}}}return n_palindromic;
}
main:
class Solution {
public:long long kMirror(int k, int n) {int i=1;vector<long long> ans;while(n){vector<long long> temp=palindromic_number(i,n,k);n-=temp.size();ans.insert(ans.end(),temp.begin(),temp.end());i++;}long long ansall=0;int len = ans.size();for(int i=0;i<len;i++){ansall+=ans[i];}return ansall;}
};
复杂度是n、k的函数