【JZOJ3362】【BZOJ3758】数数

博客探讨了神犇关于数字之美的哲学观点,特别是如何判断一个数是否优美——即其各位数字能分成两个和相等的集合。博主提出在给定区间[A,B]内寻找优美数的数量,指出暴力算法配合剪枝可以解决,并提示可以每10^6进行一次分段打表以优化计算。" 115908227,10548633,MATLAB S-Function实现传递函数仿真,"['MATLAB', '仿真', 'S-Function', '传递函数']

description

神犇最近闲来无事,于是就思考哲学,研究数字之美。在神犇看来,如果一个数的各位能够被分成两个集合,而且这两个集合里的数的和相等,那么这个数就是优美的(具体原因就只有神犇才知道了)。现在神犇在思考另一个问题,在区间[A,B]中有多少个数是优美的?这个问题对于神犇来说很简单,相信对于你来说也不难。


analysis

  • 暴力明显好打,注意剪枝即可

  • 10910^9109太小了,容易想到分段打表

  • 每隔10610^6106打一次表,剩下的暴力求就好


code

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define mod 1000000
#define ll long long
#define reg register ll
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i)

using namespace std;

int f[105];
bool bz[15];
ll a[15];
ll x,y,tot,ans,tmp;
bool flag;

inline ll read()
{
   
   
	ll x=0,f=1;char ch=getchar();
	while (ch<'0' || '9'<ch){
   
   if (ch=='-')f=-1;ch=getchar();}
	while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
	return x*f;
}
inline void dfs(ll x,ll y)
{
   
   
	if (y>tot-y)return;
	if (x>a[0])
	{
   
   
		if (y==tot-y)++ans,flag=1;
		return;
	}
	bz[x]=0,dfs(x+1,y);
	if (flag)return;
	bz[x]=1,dfs(x+1,y+a[x]);
}
inline ll get(ll x)
{
   
   
	if (x<=10)return 0;
	tmp=x/mod,ans=(ll)f[tmp];
	fo(i,tmp*mod+1,x)
	{
   
   
		ll tmp=i;a[0]=tot=0;memset(bz,0,sizeof(bz));
		while (tmp)a[++a[0]]=tmp%10,tot+=tmp%10,tmp/=10;
		if (tot&1)continue;
		flag=0,dfs(1,0);
	}
	return ans;
}
inline void init()
{
   
   
f[1]=376413,f[2]=832547,f[3]=1288828,f[4]=1744956,f[5]=2196800,f[6]=2647716,f[7]=3090920,
f[8]=3526440,f[9]=3951372,f[10]=4366880,f[11]=4823015,f[12]=5304766,f[13]=5797144,f[14]=6290672,
f[15]=6782004,f[16]=7272530,f[17]=7758910,f[18]=8238396,f[19]=8710536,f[20]=9182258,f[21]=9638539,
f[22]=10130918,f[23]=10610575,f[24]=11103529,f[25]=11590745,f[26]=12080513,f[27]=12565094,f[28]=13045216,
f[29]=13523103,f[30]=13996047,f[31]=14452175,f[32]=14945703,f[33]=15438658,f[34]=15913605,f[35]=16403907,
f[36]=16892727,f[37]=17371943,f[38]=17858307,f[39]=18339125,f[40]=18810719,f[41]=19262563,f[42]=19753895,
f[43]=20241111,f[44]=20731414,f[45]=21199399,f[46]=21684697,f[47]=22170473,f[48]=22655525,f[49]=23128982,
f[50]=23601310,f[51]=24052226,f[52]=24542752,f[53]=25032520,f[54]=25521340,f[55]=26006639,f[56]=26480512,
f[57]=26967738,f[58]=27450344,f[59]=27929454,f[60]=28401296,f[61]=28844500,f[62]=29330880,f[63]=29815461,
f[64]=30294677,f[65]=30780453,f[66]=31267680,f[67]=31727883,f[68]=32207445,f[69]=32681531,f[70]=33151141,
f[71]=33586661,f[72]=34066147,f[73]=34546269,f[74]=35032633,f[75]=35517685,f[76]=36000291,f[77]=36479854,
f[78]=36928875,f[79]=37398605,f[80]=37865237,f[81]=38290169,f[82]=38762309,f[83]=39240196,f[84]=39721014,
f[85]=40194471,f[86]=40673581,f[87]=41147667,f[88]=41617398,f[89]=42050819,f[90]=42514127,f[91]=42929635,
f[92]=43401357,f[93]=43874301,f[94]=44345895,f[95]=44818223,f[96]=45290065,f[97]=45759675,f[98]=46226307,
f[99]=46689616,f[100]=47111407,f[101]=47567542,f[102]=48049293,f[103]=48541671,f[104]=49035199,f[105]=49526531,
f[106]=50017057,f[107]=50503437,f[108]=50982923,f[109]=51455063,f[110]=51926786,f[111]=52408537,f[112]=52900916,
f[113]=53398017,f[114]=53897101,f[115]=54395976,f[116]=54894264,f[117]=55390376,f[118]=55882154,f[119]=56370124,
f[120]=56858336,f[121]=57350715,f[122]=57847816,f[123]=58346901,f[124]=58846682,f[125]=59346650,f[126]=59846494,
f[127]=60345546,f[128]=60842736,f[129]=61337762,f[130]=61832643,f[131]=62326171,f[132]=62825256,f[133]=63325037,
f[134]=63822618,f[135]=64321881,f[136]=64821477,f[137]=65319367,f[138]=65818159,f[139]=66315614,f[140]=66811192,
f[141]=67302524,f[142]=67801399,f[143]=68301368,f[144]=68800631,f[145]=69295186,f[146]=69792675,f[147]=70292149,
f[148]=70790949,f[149]=71286703,f[150]=71781713,f[151]=72272239,f[152]=72770527,f[153]=73270371,f[154]=73769968,
f[155]=74267457,f[156]=74763402,f[157]=75261351,f[158
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值