本文主要是介绍【UVAlive】康托展开的思想,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目链接:点击打开链接
题目大意:就是给你一个n 求0~n之间的数 的k-进制和(-k)进制相同的数目
题目分析:要是的k和(-k)进制的数相同,那么就是在转化为k(-k)进制之后,在奇数位上 为全零。
对于n在转化为长度为len的k进制数后 从最高位开始“递归”看
即康托展开的思想。
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;
int a[150];
int main()
{long long n, k, ans,mul,i,j;int len,flag;while (cin>>n>>k){i=n, len=0;while (i){a[len++] = i%k;i /= k;}flag=1, i = len-1;if (i%2==0) i--;for(;i>=1&&flag;i-=2){if(a[i]){for(j=i-1; j>=0;j-=2)a[j]=k-1;flag=0;}}ans = 0;mul=1;//cout<<len<<endl;for(i=0; i<len; i+=2){ans += mul*a[i]; mul*=k;}cout<<ans+1<<endl;}return 0;
}
这篇关于【UVAlive】康托展开的思想的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!