【LOJ 10163】Amount of Degrees
1057. Amount of Degrees
Time limit: 1.0 second
Memory limit: 64 MB
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 = 24+20,
18 = 24+21,
20 = 24+22.
18 = 24+21,
20 = 24+22.
Input
The first line of input contains integers X and Y, separated with a space (1 ≤ X ≤ Y ≤ 231−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 20 2 2 |
3 |
Problem Source: Rybinsk State Avia Academy
Tags: none
题解:食用:https://loj.ac/problem/10163 效果更佳。copy不来数字和字母。
数位DP,详细内容见jl课件。
#include<iostream> #include<algorithm> #include<queue> #include<cmath> #include<cstring> #include<cstdlib> #include<cstdio> using namespace std; int x,y,k,b; int h[31],f[66][66]; void Yao_Chen_Lai_le(){ f[0][0]=1; f[0][1]=1; for(int i=1;i<=31;i++){ f[i][0]=1; for(int j=1;j<=i+1;j++) f[i][j]=f[i-1][j-1]+f[i-1][j]; } } int Cookies(int x){ int top=-1; while(x){ int p=x%b; x/=b; h[++top]=p; } int biu=0,ans=0; for(int i=top;i>=0;i--){ if(h[i]==1){ biu++; if(biu>k+1) break; if(i>0) ans+=f[i-1][k-biu+1]; } else { if(h[i]>1){ ans+=f[i][k-biu]; return ans; } } } if(biu==k) ++ans; return ans; } int main(){ freopen("10163.in","r",stdin); freopen("10163.out","w",stdout); scanf("%d %d %d %d",&x,&y,&k,&b); Yao_Chen_Lai_le(); printf("%d\n",Cookies(y)-Cookies(x-1)); return 0; }