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^9C++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; }