1057. Amount of degreestime 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
KDifferent integer degrees
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 = 24 + 20,
18 = 24 + 21,
20 = 24 + 22. inputthe first line of input contains Integers
XAnd
Y, Separated with a space (1 ≤
X≤
Y≤0, 231? 1). The next two lines contain Integers
KAnd
B(1 ≤
K≤ 20; 2 ≤
B≤ 10). outputoutput shoshould contain a single integer-the amount of integers, lying
XAnd
Y, Being a sum of exactly
KDifferent integer degrees
B. Sample
Problem Source:Rybinsk state Avia Academy
Tags:None ()
A special number is defined first. A special number is composed of k different B ^ x mails. Ask how many special numbers are in [x, y. Idea: Digital DP. DP [I] [J] indicates the binary representation. The number where I is 1 is the total number of J. Other hexadecimal formats are similar. Note the boundary. For details, see the code:
#include<algorithm>#include<iostream>#include<string.h>#include<stdio.h>#include<stdlib.h>using namespace std;const int INF=0x3f3f3f3f;const int maxn=100010;typedef long long ll;int dp[35][35],base[35],bin[35];void init(){ dp[0][0]=base[0]=1; for(int i=1;i<=32;i++) { dp[i][0]=1; base[i]=base[i-1]<<1; for(int j=1;j<=i;j++) dp[i][j]=dp[i-1][j]+dp[i-1][j-1]; }}int calc(int x,int k){ int i,one=0,ans=0; for(i=31;i>=0;i--) { if(x&base[i]) { if(one>k) break; ans+=dp[i][k-one]; one++; x-=base[i]; } } if(one==k) ans++; return ans;}int getbin(int x,int b){ int ct=0,i,ret=0; if(!x) return x; while(x) { bin[ct++]=x%b; x/=b; } for(i=ct-1;i>=0;i--) { if(bin[i]>1) break; if(bin[i]) ret=ret<<1|1; else ret<<=1; } while(i>=0) { ret=ret<<1|1; i--; } return ret;}int main(){ int x,y,k,b; init(); while(~scanf("%d%d%d%d",&x,&y,&k,&b)) { y=getbin(y,b); x=getbin(x-1,b); printf("%d\n",calc(y,k)-calc(x,k)); } return 0;}
Ural 1057 amount of degrees (Digital DP)