【zhx】endless【解题报告】

终末

 

【问题描述】

 

你是能看到第二题的 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 }
ac代码

 

转载于:https://www.cnblogs.com/hyghb/p/7764396.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值