zoukankan      html  css  js  c++  java
  • 牛客小白月赛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
    ",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
    ",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
    ",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
    ",i,j);
    24             }
    25         }
    26     }
    27     return 0;
    28 }
  • 相关阅读:
    bzoj3505 数三角形 组合计数
    cogs2057 殉国 扩展欧几里得
    cogs333 荒岛野人 扩展欧几里得
    bzoj1123 BLO tarjan求点双连通分量
    poj3352 road construction tarjan求双连通分量
    cogs1804 联合权值 dp
    cogs2478 简单的最近公共祖先 树形dp
    cogs1493 递推关系 矩阵
    cogs2557 天天爱跑步 LCA
    hdu4738 Caocao's Bridge Tarjan求割边
  • 原文地址:https://www.cnblogs.com/xingkongyihao/p/9353402.html
Copyright © 2011-2022 走看看