2017.9.9 幸运数字 失败总结

来源:互联网 发布:淘宝联盟api免费申请 编辑:程序博客网 时间:2024/06/08 08:15

爆搜是有多玄学、

理论复杂度2^900 然后100ms一个点、

首先递推出只含8、6的数

然后去掉内部倍数、

然后直接暴力容斥、这个题不得被表死

然后就是玄学的常数剪枝、基本思路依然是枚举、然后如果lcm大于r就返回、不继续搜了(这不是废话吗、

然后不知道正着搜和倒着搜有什么区别、就算从小往大搜,它也是要枚举所有比他大的数

如果从大往小搜,它也是枚举所有比他小的数、无论哪种搜都不能避免遍历枚举每个数取不取、

剪枝也都是针对两个数之后既不继续往下搜而言的、、

这个搜索顺序不应该在效率上有这么大差距(难道和底层有关、)


码 :

#include<iostream>#include<cstdio>#include<algorithm>using namespace std;#define ll long longbool ky;ll l,r,ans,shu[99999],cnt,sx,daan;ll gcd(ll a,ll b){if(!b){return a;}gcd(b,a%b);}void dfs(ll o){ll i,x=o*10+6;if(x>r)return;//ky=1;//for(i=1;i<=cnt;i++)//if(x%shu[i]==0){ky=0;break;}shu[++cnt]=x;dfs(x);x=o*10+8;if(x>r)return;//ky=1;shu[++cnt]=x;dfs(x);}void baoli(int o,int wei,ll v){int i;if(o==0){if(v>1)if(wei&1)ans+=r/v-l/v;else ans-=r/v-l/v;   return ;} baoli(o-1,wei,v);if(v/gcd(v,shu[o])<=r/shu[o]){  baoli(o-1,wei+1,v/gcd(v,shu[o])*shu[o]);         }}int main(){int i,j;scanf("%lld%lld",&l,&r);l--;dfs(0);for(i=1;i<=cnt;i++)for(j=i+1;j<=cnt;j++)if(shu[i]>0)if(shu[j]%shu[i]==0)shu[j]=0;int xx=cnt;cnt=0;for(i=1;i<=xx;i++){if(shu[i]>0)shu[++cnt]=shu[i];}sort(shu+1,shu+1+cnt);sx=r;ans=0;baoli(cnt,0,1);printf("%lld",ans);}



原创粉丝点击