URAL - 1057Amount of Degrees数位dp

xiaoxiao2021-02-28  120

题目:求给定区间[X,Y]中满足下列条件的整数个数:这个数恰好等于K 个互不相等的 B 的整 数次幂之和

思路:可以看成2进制的情况,找到第一个大于1的位置pos,从pos开始以后的数的01就可以随意组合了

dp[i][j]:2进制的情况下,长度为i的情况下,有j个1的数的个数

代码:

#pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream> #include<algorithm> #include<ctime> #include<cstdio> #include<cmath> #include<cstring> #include<string> #include<vector> #include<map> #include<set> #include<queue> #include<stack> #include<list> #include<numeric> using namespace std; #define LL long long #define ULL unsigned long long #define INF 0x3f3f3f3f3f3f3f3f #define mm(a,b) memset(a,b,sizeof(a)) #define PP puts("*********************"); template<class T> T f_abs(T a){ return a > 0 ? a : -a; } template<class T> T gcd(T a, T b){ return b ? gcd(b, a%b) : a; } template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;} // 0x3f3f3f3f3f3f3f3f int dp[35][35],dight[35]; void Init(){ mm(dp,0); dp[0][0]=1; for(int i=1;i<=31;i++){ dp[i][0]=dp[i][i]=1; for(int j=1;j<i;j++) dp[i][j]=dp[i-1][j]+dp[i-1][j-1]; } } int solve(int n,int K,int base){ if(n<0) return 0; int len=0; do{ dight[++len]=n
转载请注明原文地址: https://www.6miu.com/read-57976.html

最新回复(0)