1057. Amount of Degrees
 
 
   Time limit: 1.0 second
  
 Memory limit: 64 MB
  
 
 
Create a code to determine the amount of integers, lying in the set [ X; Y] and being a sum of exactly K different integer degrees of B.
 
  
Example. Let X=15, Y=20, K=2, B=2. By this example 3 numbers are the sum of exactly two integer degrees of number 2:
 
  
    17 = 2
    4+2
    0,
    
 18 = 2
    4+2
    1,
    
 20 = 2
    4+2
    2.
   
 
  
Input
 
  
The first line of input contains integers X and Y, separated with a space (1 ≤ X ≤ Y ≤ 2 31−1). The next two lines contain integers K and B (1 ≤ K ≤ 20; 2 ≤ B ≤ 10).
 
  
Output
 
  
Output should contain a single integer — the amount of integers, lying between X and Y, being a sum of exactly K different integer degrees of B.
 
  
Sample
|  input |  output | 
| 15 2022 | 3 | 
Problem Source: Rybinsk State Avia Academy
 
Tags: none ( hide tags for unsolved problems
 
  Difficulty: 767    
 Printable version    
 Submit solution    
 Discussion (36)
 
My submissions    
 All submissions (8400)    
 All accepted submissions (1733)   
 Solutions rating (1300)
 
思路:转成B进制,只要是B进制打头的是01皆可以。DP之
 
 
#include<iostream>
#include<cstring>
#include<cstdio>
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define clr(f,z) memset(f,z,sizeof(f))
using namespace std;
const int mm=65;
int f[mm][mm];
int bit[mm];
int DP(int n,int num,int b)
{
    int pos=0;
    while(n)
    {
        bit[++pos]=n%b;n/=b;
    }
    int ret=0,one=0;
    for(int i=pos;i>=1;--i)
    {
        if(bit[i]>1)
        {ret+=f[i][num-one];break;//已经大于了
        }
        else if(bit[i])
        {
            ret+=f[i-1][num-one];++one;//相等则下一层可选,多一个1
        }
        if(i==1&&one==num)++ret;//相等的情况
    }
    return ret;
}
int main()
{
    FOR(i,0,mm-1)f[i][0]=1;
    FOR(i,1,mm-1)FOR(j,1,mm-1)
    f[i][j]=f[i-1][j-1]+f[i-1][j];//0 or 1
    int X,Y,K,B;
    while(~scanf("%d%d%d%d",&X,&Y,&K,&B))
    {
        printf("%d\n",DP(Y,K,B)-DP(X-1,K,B));
    }
    return 0;
} 
 









