标签:问题 space 奇数 img include 进制 code mda 分享
终末
【问题描述】
你是能看到第二题的 friends 呢。
——laekov
没有尽头的世界之中,我们想知道0 − 中有多少个数在 进制下和− 进制下的表示方式一样。(举个例子,4的−3进制表示为4 = 121−3 = 1 × (−3)2 +
2 × (−3)1 + 1 × (−3)0)
【输入格式】
一行两个整数 n,k 。
【输出格式】
一行一个整数代表答案。
【样例输入】
21 3
【样例输出】
9
【数据范围与规定】
对于40%的数据,n ≤ 1000。
对于另外30%的数据,k = 2
对于100%的数据,1 ≤ n≤ 1015, 2 ≤k ≤ 103。
pdf转word好不靠谱...
我们先看一下部分分,对于40%的数据,我们可以从1到n枚举一下,判断每个数是否符合条件,具体操作是先转换成k进制数,然后假设(-k)进制数也是这个,乘回去变成原来的10进制,判断一下是否和以前的10进制相等即可。
对于k=2,我没有想到什么解法qwq
对于100%,我们可以先对于i拆成k和-k进制看看
i=a0*k^0+a1*k^1+a2*k^2+...+an*k^n
i=a0*(-k)^0+a1*(-k)^1+a2*(-k)^2+...+an*(-k)^n
那么两式相加
2*i=2*a0*k^0+2*a2*k^2+...+2*an*k^n(n%2=0)
i=a0*k^0+a2*k^2+...+an*k^n(n%2=0)
那么可以看出a1,a3...这些项都为0。
那么我们就将n拆成k进制数(p[]),通过枚举每一位选什么处理即可。
那怎么处理呢,好像有很多种方法,我的方法大概是:
偶数位必须是0,奇数位依次枚举
对于拆成的k进制数长度为len,
如果len为偶数,那么他必须为0,那么其他的奇数位每一位有k种选择,乘起来即可
如果len为奇数,那么当最高位p[len]为p[len]-1及以下时,后面位是可以任意选的,记方案数为tem1
但当最高位选p[len]时,就对其他位有了一些限制,我们从高到低枚举,p数组偶数位有非0数,那么比他低的位数可以随意选择
不然的话只能在0--p[i]之间枚举,我们可以把他们(奇数位选择的上界)整体理解为一个新的k进制数x,另外
还有选择0的情况,所以最终的ans为tem1+x+1。
1 #include<bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 ll n; 5 int k,p[105],len; 6 int main() 7 { 8 scanf("%I64d%d",&n,&k); 9 while(n){ 10 p[++len]=n%k; 11 n/=k; 12 } 13 // for(int i=len;i>=1;i--)cout<<p[i]; 14 ll ans=1; 15 for(int i=1;i<len;i++){ 16 if(i&1) 17 ans*=k; 18 } 19 if(len&1)ans*=p[len]; 20 ll tem=0,flag=0; 21 if(len&1) 22 for(int i=len-1;i>=1;i--){ 23 if(i&1){ 24 if(!flag){ 25 tem=tem*k+p[i]; 26 } 27 else tem=tem*k+k-1; 28 } 29 else if(p[i])flag=1; 30 } 31 if(len&1)tem++; 32 printf("%I64d\n",ans+tem); 33 return 0; 34 }
标签:问题 space 奇数 img include 进制 code mda 分享
原文地址:http://www.cnblogs.com/Turkeyghb/p/7764396.html