CodeForces - 215E 【数位dp】

Ť题意:判断一个区间中有多少个数是二进制时是循环的,比如101010,以10为循环。

思路:以位数来处理,i是处理到当前长度i,j是循环体的长度,当i

 #include
 #include
 #include 
using namespace std;
#define ll long long
int a[100];ll dp[100];
ll cal(int len,int j,ll o)
{
	ll c=0,b=1;
	for(int i=1;i<=j;i++)
	{
		c+=(a[len-i+1]<<(j-i));//n值的前j位以他当作最大的循环体,比这个循环体小的都可以
	}
	b=c;
	for(int i=1;i<=len/j-1;i++)//以这个循环体求得len长度的值(用来比较和n的大小
		b<<=j,b+=c;
	ll sum=1<<(j-1);
	return c-sum+(b<=o);//c-sum就是比循环体小的个数
	
}
ll solve(ll w)
{
	int len=0;
	ll ww=w;
	ll ans=0;
	while(w)
	{
		a[++len]=w%2;
		w/=2;		
	}
	for(int i=2;i<=len;i++)
	{
		memset(dp,0,sizeof(dp));
		for(int j=1;j<=i/2;j++)
		{
			if(i%j!=0) continue;
			if(i>n>>m;
	printf("%lld\n",solve(m)-solve(n-1));
	return 0;
}

 

你可能感兴趣的:(动态规划)