列表

详情


NC208248. 牛牛的零食

描述

牛牛是怎么胖的呢?当然是因为他太热爱吃零食了,牛牛给他的每一份零食编了号,每次他会拿出编号在[a,b]区间里能被8整除却不能被另外一些数中的任意一个整除的零食吃掉。现在请你帮他算一算他这一次到底能吃多少份零食吧?



输入描述

第一行一个数n,代表不能被整除的数的个数。
第二行n个数,中间用空格隔开。
第三行两个数a,b,中间一个空格。

输出描述

一个整数,为牛牛能吃到的零食份数,也就是[a,b]间中能被8整除却不能被给出的那n个数中任意一个整除的数的个数。

示例1

输入:

3
7764 6082 462
2166 53442

输出:

6378

说明:

1≤n≤15,1≤a≤b≤10^9

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 3ms, 内存消耗: 376K, 提交时间: 2020-07-02 22:05:20

#include<cstdio>
 
typedef long long ll;
ll n,a,b,ans,s[20];
ll gcd(ll a,ll b){return b==0?a:gcd(b,a%b);}
ll lcm(ll a,ll b){return a*b/gcd(a,b);}
 
void dfs(ll x,ll p,ll t){
  if(t>b)return;
  if(x%2==0)ans+=b/t-a/t;
  else ans-=b/t-a/t;
  for(int i=p+1;i<=n;i++)
    dfs(x+1,i,lcm(t,s[i]));
  return;
}
 
int main(){
  scanf("%lld",&n);
  for(int i=1;i<=n;i++)scanf("%lld",&s[i]);
  scanf("%lld%lld",&a,&b);
  a--;
  dfs(0,0,8);
  printf("%lld\n",ans);
  return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 3ms, 内存消耗: 484K, 提交时间: 2020-06-29 20:40:17

#include<bits/stdc++.h>
using namespace std;
#define ll long long
 
const int MAXN = 20;
ll N,a,b,ans;
ll num[MAXN];
ll lcm(ll a,ll b){return a*b/__gcd(a,b);}
 
void dfs(ll x,ll p,ll t)
{
    if(t>b) return;
    if(x%2==0) ans+=b/t-a/t;
    else ans-=b/t-a/t;
    for(int i=p+1;i<=N;i++)
        dfs(x+1,i,lcm(t,num[i]));
}
 
int main()
{
    cin>>N;
    for(int i=1;i<=N;i++)
        scanf("%lld",num+i);
    cin>>a>>b;
    a--;
    dfs(0,0,8);
    cout<<ans;
}

上一题