您的位置:首页 > 其它

bzoj 1853 幸运数字

2015-11-16 10:38 246 查看
!x是x==0的意思!!!预处理出只含86的数字,利用容斥原理求解。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>

#define md
#define ll long long
#define inf (int) 1e9
#define eps 1e-8
#define N 1000100
using namespace std;
ll q
;
bool tag
;
ll L,R,ans=0;
int w=0;
bool cmp(ll a,ll b) {return a>b;}
ll gcd (ll a,ll b) { return b==0?a:gcd(b,a%b);}
void dfs_86(ll x)
{
	if (x>R) return;
	if (x) q[++w]=x;
	dfs_86(x*10+6); dfs_86(x*10+8);
}
void dfs(int pos,int dep,ll lcm)
{
	if (pos>w) return;
	dfs(pos+1,dep,lcm);
	if (tag[pos]) return;
	lcm*=(q[pos]/gcd(lcm,q[pos]));
	if ((lcm<=0)||lcm>R) return;
	dep++;
	if (dep&1) ans+=R/lcm-(L-1)/lcm;
	  else ans-=R/lcm-(L-1)/lcm;
	dfs(pos+1,dep,lcm);
}
	
int main()
{
	scanf("%lld%lld",&L,&R);
	dfs_86(0);
	sort(q+1,q+w+1,cmp);
	for (int i=1;i<=w;i++)
	  for (int j=i+1;j<=w;j++)
	    if (q[i]%q[j]==0) { tag[i]=1; break;}
	dfs(1,0,1);
	printf("%lld\n",ans);
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: