牛客小白月赛5 ADFGHIJ
A 无关(relationship)
链接:https://www.nowcoder.com/acm/contest/135/A
来源:牛客网
题目描述
若一个集合A内所有的元素都不是正整数N的因数,则称N与集合A无关。
输入描述:
输入数据共两行:
第一行三个正整数L,R,k,意义如“题目描述”。
第二行k个正整数,描述集合A,保证k个正整数两两不相同。
输出描述:
输出数据共一行:
第一行一个正整数表示区间[L,R]内与集合A无关的正整数的个数
说明
对于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
求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
来源:牛客网
题目描述
Apojacsleam来到了OI大陆,经过了连年征战,成为了一方国王。
Apojacsleam把他的王国命名为“Apo国”,Apo国的领土是一个标准的圆形。
Apojacsleam现在想封赏他的大臣,他在国境上建立了n个城市,要求他的大臣对这n个城市两两之间修建道路(道路是笔直的),把整个王国分成尽量多的区域,使得每一个大臣都有封土并且不会太大(以免谋反)。
于是Apojacsleam找你求助,他告诉你他打算建多少个城市,而你的任务是告诉他最多可以分成多少个部分。
说的太慢可是要被处死的,所以你必须要在1s之内回答。
输入描述:
输入数据有多组,每组一行,一个正整数n,意义如“题目描述”
输出描述:
对于每一组数据输出一行描述答案:
输出一个正整数k,表示最多分成k份。
说明
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 #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
输入描述:
输入共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 #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就是回文时刻。
输入描述:
两个正整数,用“:”隔开,表示小时和分钟,保证输入时间合法。
输出描述:
两行,两个时刻(不含前导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 }