BZOJ 1853: [Scoi2010]幸运数字

来源:互联网 发布:怎么在淘宝买东西便宜 编辑:程序博客网 时间:2024/06/06 07:02

暴力搞搞,容斥原理
因为会爆longlong所以要换成double
先暴力预处理出<r且只含有68
然后排序,把是另外一个幸运数的倍数的数去掉(听起来好拗口。。)
然后容斥就好了
假设一个数v同时是x个数的倍数
如果x为奇数,我们就加r÷x(l1)÷x反之则减
一开始迷のTLE原来是忘记排序了。。。。。
BZOJ 百题AC纪念


#include<cstdio>#include<cstring>#include<algorithm>#define g getchar()#define ll long long#define inf 0x3f3f3f3fusing namespace std;inline ll read(){    ll x=0,f=1;char ch=g;    for(;ch<'0'||ch>'9';ch=g)if(ch=='-')f=-1;    for(;ch>='0'&&ch<='9';ch=g)x=x*10+ch-'0';    return x*f;}inline void out(ll x){    int a[25],wei=0;    if(x<0)putchar('-'),x=-x;    for(;x;x/=10)a[++wei]=x%10;    if(wei==0){puts("0");return;}    for(int j=wei;j>=1;--j)putchar('0'+a[j]);    putchar('\n');}ll l,r,a[100005],top,ans,b[10005],m;bool vis[100005];ll gcd(ll x,ll y){return x%y?gcd(y,x%y):y;}int pre(ll x){    if(x>r)return 0;    if(x)a[++top]=x;    pre(x*10+6);    pre(x*10+8);    return 0;}int dfs(int x,int f,ll v){    if(!x){if(v!=1)ans+=(r/v-(l-1)/v)*f;return 0;}    dfs(x-1,f,v);    ll tmp=b[x]/gcd(v,b[x]);if((tmp+0.0)*v>r)return 0;    dfs(x-1,-f,v*tmp);    return 0;}int main(){//  freopen("","r",stdin);//  freopen("","w",stdout);    l=read(),r=read();    pre(0);    sort(a+1,a+1+top);    for(ll i=1;i<top;++i)    for(ll j=i+1;j<=top;++j)    if(a[j]%a[i]==0)vis[j]=1;    for(ll i=1;i<=top;++i)    if(!vis[i])b[++m]=a[i];    dfs(m,-1,1);    out(ans);    return 0;}
0 0
原创粉丝点击