牛客小白月赛5 ADFGHIJ

A 无关(relationship)

链接:https://www.nowcoder.com/acm/contest/135/A
来源:牛客网

题目描述

  若一个集合A内所有的元素都不是正整数N的因数,则称N与集合A无关。

  给出一个含有k个元素的集合A={a1,a2,a3,...,ak},求区间[L,R]内与A无关的正整数的个数。
  保证A内的元素都是 素数

输入描述:

输入数据共两行:

第一行三个正整数L,R,k,意义如“题目描述”。

第二行k个正整数,描述集合A,保证k个正整数两两不相同。

输出描述:

输出数据共一行:

第一行一个正整数表示区间[L,R]内与集合A无关的正整数的个数
示例1

输入

复制
1 10 4
2 3 5 7

输出

复制
1
示例2

输入

复制
2 10 4
2 3 5 7

输出

复制
0

说明

对于30%的数据:1<=L<=R<=10^6

对于100%的数据:1<=L<=R<=10^18,1<=k<=20,2<=ai<=100

排斥定理,先放下大佬的代码。
 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 ll a[33], l, r, k;
 5 ll solve(ll lv, ll v) {
 6     if(lv == k) return v;
 7     return solve(lv+1,v)-solve(lv+1,v/a[lv]);
 8 }
 9 int main() {
10     cin >> l >> r >> k;
11     for(int i = 0; i < k; i ++) cin >> a[i];
12     cout << solve(0, r) - solve(0,l-1) << endl;
13     return 0;
14 }

D 阶乘(factorial)

链接:https://www.nowcoder.com/acm/contest/135/D
来源:牛客网

题目描述

输入描述:

输入数据共一行,一个正整数n,意义如“问题描述”。

输出描述:

输出一行描述答案:

一个正整数k,表示S的末尾有k个0
示例1

输入

复制
10

输出

复制
7

说明

  鸣谢真·dalao Tyxao

求5的因子。没啥好说的,考察代码基本功吧。

 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 
 5 ll cal(ll n) {
 6     if(n<5) return 0;
 7     else {
 8         n /= 5;
 9         return n+cal(n);
10     }
11 }
12 int main() {
13     ll n, ans = 0, y;
14     cin >> n;
15     ll cnt1 = 1, cnt2 = 5;
16     y = n;
17     while(n > 4) {
18         for(ll i = n-n%5; i <= n; i ++) ans += cnt1*cal(i);
19         n = n-n%5-1;
20         ll tmp = n/5;
21         ans += cnt2*(tmp+1)*tmp/2;
22         n /= 5;
23         cnt1*=5;cnt2*=5;
24     }
25     cout << ans << endl;
26     return 0;
27 }

F 圆(circle)

链接:https://www.nowcoder.com/acm/contest/135/F
来源:牛客网

题目描述

    签到题来了,送你们一个 Python秒的题。

    Apojacsleam来到了OI大陆,经过了连年征战,成为了一方国王。

    Apojacsleam把他的王国命名为“Apo国”,Apo国的领土是一个标准的圆形

    Apojacsleam现在想封赏他的大臣,他在国境上建立了n个城市,要求他的大臣对这n个城市两两之间修建道路(道路是笔直的),把整个王国分成尽量多的区域,使得每一个大臣都有封土并且不会太大(以免谋反)。

    于是Apojacsleam找你求助,他告诉你他打算建多少个城市,而你的任务是告诉他最多可以分成多少个部分。

    说的太慢可是要被处死的,所以你必须要在1s之内回答。

输入描述:

输入数据有多组,每组一行,一个正整数n,意义如“题目描述”

输出描述:

对于每一组数据输出一行描述答案:

输出一个正整数k,表示最多分成k份。
示例1

输入

复制
2
3

输出

复制
2
4

说明

样例解释(样例1和样例2一起解释了):
示例2

输入

复制
4
5
6

输出

复制
8
16
31

说明

 
找规律,找不到就在http://oeis.org/这个网站查了下,还真查到了。规律为a(n) = (n^4 - 6*n^3 + 23*n^2 - 18*n + 24)/24.
 
 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 
 5 int main() {
 6     ll n;
 7     while(cin >> n) {
 8         cout << (n*n*n*n-6*n*n*n+23*n*n-18*n+24)/24<< endl;
 9     }
10     return 0;
11     
12 }

G 异或(xor)

链接:https://www.nowcoder.com/acm/contest/135/g
来源:牛客网

题目描述

    从前,Apojacsleam家的水族箱里,养了一群热带鱼。

    在这几条热带鱼里,Apojacsleam特别喜欢一条叫做TbGx(请勿人肉)的热带鱼,所以每次都让她第一个吃食物。对于每一条鱼,Apojacsleam都有一个顺序,鱼会按照这个顺序排序,越靠前的地位越高。

   吃饱喝足是要睡觉的,这是人的刚需,也是鱼的刚需。

    如果TbGx吃了Apojacsleam的食物,她就会睡觉(睡觉时长远小于一天)。这时第二条鱼还是饥肠辘辘的,第二条鱼就可以吃掉TbGx,那么第二条鱼又会睡觉......

    注意:Apojacsleam养的鱼比Apojacsleam的智商高到不知道哪里去了,他们都是绝顶聪明的;而他们又是极其守规矩的,即他们不会多鱼分食一条鱼或者食物,只是按照顺序吃;当某一条鱼前面的鱼睡着以后,他可以选择不吃这条鱼,那么别的鱼(还活着的)也不会吃这条,即按照顺序的吃。

    一开始,水族箱里只有TbGx一条鱼(未成年),但是,一条鱼成长两天就会成年,成年后就可以繁殖(无性繁殖?别问我我不知道),一天能繁殖一个后代。小鱼也会吃鱼的偶!

   请问在前n天中,TbGx最多多少天可以吃饭?

    Apojacsleam不希望TbGx饿着,所以你必须在1s内回答。

输入描述:

输入数据有多组,每组一个正整数n,意义如“题目描述”

输出描述:

对于每组输入数据,一行输出:

即前n天中,最多有多少天TbGx可以吃饭。
示例1

输入

复制
6

输出

复制
4

说明

第1天,1条鱼,能吃;
第2天,1条鱼,能吃;
第3天,2条鱼,不能吃;
第4天,3条鱼,能吃;
第5天,5条鱼,能吃;
第6天,8条鱼,不能吃;。
 
2n/3向上取整,还真想不到。。。
 1 #include <bits/stdc++.h>
 2 #define ll unsigned long long
 3 using namespace std;
 4 
 5 int main() {
 6     ll n;
 7     while(scanf("%lld", &n) != EOF){
 8         cout << n/3*2+n%3 << endl;
 9     }
10     return 0;
11 }

H 最大公约数(lcm)

送分题

 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 #define ull unsigned long long
 4 using namespace std;
 5 int main() {
 6     ull l, r;
 7     cin >> l >> r;
 8     ull a = __gcd(l,r);
 9     cout << l/a*r<<endl;
10     return 0;
11 }

I 区间 (interval)

链接:https://www.nowcoder.com/acm/contest/135/i
来源:牛客网

题目描述

    Apojacsleam喜欢数组。

    他现在有一个n个元素的数组a,而他要对a[L]-a[R]进行M次操作:

        操作一:将a[L]-a[R]内的元素都加上P

        操作二:将a[L]-a[R]内的元素都减去P

    最后询问a[l]-a[r]内的元素之和?
    请认真看题干及输入描述。

输入描述:

输入共M+3行:

第一行两个数,n,M,意义如“题目描述”

第二行n个数,描述数组。

第3-M+2行,共M行,每行四个数,q,L,R,P,若q为1则表示执行操作2,否则为执行操作1

第4行,两个正整数l,r

输出描述:

一个正整数,为a[l]-a[r]内的元素之和
示例1

输入

复制
10 5
1 2 3 4 5 6 7 8 9 10
1 1 5 5
1 2 3 6
0 2 5 5 
0 2 5 8
1 4 9 6
2 7

输出

复制
23

说明

区间修改题目,只用一次查询,可以用前缀和来做,比赛没想到,用了线段树,

 1 #include <iostream>
 2 #include <stdio.h>
 3 #define ll long long
 4 #define lson l,m,rt<<1
 5 #define rson m+1,r,rt<<1|1
 6 using namespace std;
 7 const int N = 1e6+10;
 8 ll tree[N<<2], lazy[N<<2];
 9 
10 void PushUp(int rt) {
11     tree[rt] = tree[rt<<1] + tree[rt<<1|1];
12 }
13 
14 void PushDown(int rt, int m) {
15     if(lazy[rt]) {
16         lazy[rt<<1] += lazy[rt];
17         lazy[rt<<1|1] += lazy[rt];
18         tree[rt<<1] += lazy[rt]*(m-(m>>1));
19         tree[rt<<1|1] += lazy[rt]*(m>>1);
20         lazy[rt] = 0;
21     }
22 }
23 
24 void build(int l, int r, int rt) {
25     if(l == r) {
26         scanf("%lld", &tree[rt]);
27         return;
28     }
29     int m = (l+r)>>1;
30     build(lson);
31     build(rson);
32     PushUp(rt);
33 }
34 
35 void update(int L, int R, int val, int l, int r, int rt) {
36     if(L <= l && r <= R) {
37         lazy[rt] += val;
38         tree[rt] += (ll)val*(r-l+1);
39         return;
40     }
41     PushDown(rt, r-l+1);
42     int m = (l+r)>>1;
43     if(m >= L) update(L, R, val, lson);
44     if(m < R) update(L, R, val, rson);
45     PushUp(rt);
46 }
47 
48 ll query(int L, int R, int l, int r, int rt) {
49     if(L <= l && r <= R) {
50         return tree[rt];
51     }
52     PushDown(rt, r-l+1);
53     int m = (l+r)>>1;
54     ll ans = 0;
55     if(m >= L) ans += query(L, R, lson);
56     if(m < R) ans += query(L, R, rson);
57     return ans;
58 }
59 
60 
61 int main() {
62     int n, q;
63     scanf("%d%d",&n,&q);
64     build(1,n,1);
65     while(q--) {
66         int o, l, r, p;
67         scanf("%d%d%d%d", &o, &l, &r, &p);
68         if(o == 1) update(l,r,-p,1,n,1);
69         else update(l,r,p,1,n,1);
70     }
71     int l,r;
72     cin >> l >> r;
73     printf("%lld\n",query(l,r,1,n,1));
74     return 0;
75 }

前缀和代码:

 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 const int N = 1e6+10;
 5 ll a[N], b[N];
 6 int main() {
 7     int n, m, o, l, r, p;
 8     cin >> n >> m;
 9     for(int i = 1; i <= n; i ++) scanf("%lld", &a[i]);
10     while(m--) {
11         scanf("%d%d%d%d", &o, &l, &r, &p);
12         if(o == 1) b[l] -= p, b[r+1] += p;
13         else b[l] += p, b[r+1] -= p;
14     }
15     scanf("%d%d", &l, &r);
16     ll ans = 0;
17     for(int i = 1; i <= r; i ++) {
18         b[i] += b[i-1];
19         if(i >= l) {
20             ans += a[i];
21             ans += b[i];
22         }
23     }
24     printf("%lld\n",ans);
25     return 0;
26 }

J 时间(time)

链接:https://www.nowcoder.com/acm/contest/135/j
来源:牛客网

题目描述

         Apojacsleam是一个喜欢特殊时刻的人。

        他定义了一个时刻,若电子表显示ab:ba(24小时制),则该时刻为“回文时刻”(可以有前导零)。例如00:00就是回文时刻。

        给定一个时刻,求此时刻的上一个和下一个回文时刻。
J题附加:00:00就是24:00,没有24:00这一时刻
J题附加:输入可能有前导0,输出不含前导0,例如10:1的意思是10:01,而10:10的输出为10:10 

输入描述:

两个正整数,用“:”隔开,表示小时和分钟,保证输入时间合法。

输出描述:

两行,两个时刻(不含前导0),用“:”隔开,表示上一个时刻和下一个时刻
示例1

输入

复制
09:33

输出

复制
5:50
10:1
示例2

输入

复制
23:32

输出

复制
22:22
0:0

送分题。

 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 #define ull unsigned long long
 4 using namespace std;
 5 int main() {
 6     int a, b, flag = 0;
 7     scanf("%d:%d",&a,&b);
 8     for(int i = a; ; i--) {
 9         if(i < 0) i =  23;
10         for(int j = (i==a)?b-1:59; j >= 0; j --) {
11             if(i%10==j/10 && i/10==j%10) {
12                 printf("%d:%d\n",i,j);
13                 flag = 1;
14                 break;
15             }
16         }
17         if(flag)break;
18     }
19     for(int i = a; ; i ++) {
20         if(i == 24) i = 0;
21         for(int j = (i==a)?b+1:0; j < 60; j ++) {
22             if(i%10==j/10 && i/10==j%10) {
23                 return 0*printf("%d:%d\n",i,j);
24             }
25         }
26     }
27     return 0;
28 }

猜你喜欢

转载自www.cnblogs.com/xingkongyihao/p/9353402.html