牛客OI赛制测试赛2

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

无序组数
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述

给出一个二元组(A,B)
求出无序二元组(a,b) 使得(a|A,b|B)的组数
无序意思就是(a,b)和(b,a) 算一组.

输入描述:

第一行数据组数 T(1≤T≤10000)
接下来T行,每行两个正整数 A,B(1≤A,B≤10000)

输出描述:

共T行,每行一个结果
示例1

输入

复制
1
4 6

输出

复制
11

说明

样例解释:
二元组如下:
(1,1)(1,2)(1,3)(1,6)
(2,1)(2,2)(2,3)(2,6)
(4,1)(4,2)(4,3)(4,6)
共12组.
无序二元组如下:

(1,1)(1,2)(1,3)(1,6)
(2,2)(2,3)(2,6)
(4,1)(4,2)(4,3)(4,6)
共11组


直接筛素数
 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 int a[10005];
 6 
 7 void init(){
 8     for (int i = 1; i <= 10000; ++i){
 9         for (int j = i; j <= 10000; j += i){
10             a[j]++;
11         }
12     }
13 }
14 
15 int main(){
16     int t;
17     init();
18     cin>>t;
19     int x,y;
20     while(t--){
21         cin>>x>>y;
22         int one = a[x];
23         int two = a[y];
24         int ans = __gcd(x,y);
25         ans = a[ans];
26         cout<<one*two-((ans-1)*ans)/2<<endl;
27     }
28     return 0;
29 }

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

路径数量
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述

给出一个 n * n 的邻接矩阵A.
A是一个01矩阵 .
A[i][j]=1表示i号点和j号点之间有长度为1的边直接相连.
求出从 1 号点 到 n 号点长度为k的路径的数目.

输入描述:

第1行两个数n,k (20 ≤n ≤ 30,1 ≤ k ≤ 10)
第2行至第n+1行,为一个邻接矩阵

输出描述:

题目中所求的数目
示例1

输入

复制
4 2
0 1 1 0
1 0 0 1
1 0 0 1
0 1 1 0

输出

复制
2

说明

样例如图:
第一条路径:1-2-4
第二条路径:1-3-4
 
矩阵乘法可以解决此问题。
 
 1 #include <bits/stdc++.h>
 2 #define pb push_back
 3 #define test(a) cout<<a<<endl
 4 #define ll long long int
 5 using namespace std;
 6 
 7 ll n,k,x;
 8 ll cnt = 0;
 9 ll v[32][32],b[32][32];
10 ll vis[32][32];
11 
12 
13 int main(){
14     cin>>n>>k;
15     for (int i = 1; i <= n; ++i){
16         for (int j = 1; j <= n; ++j){
17             cin>>v[i][j];
18             vis[i][j] = v[i][j];
19         }
20     }
21     k--;
22     while(k--){
23         memset(b,0,sizeof(b));
24         for(int i = 1; i <= n; ++i){
25             for(int j = 1; j <= n; ++j){
26                 for(int p = 1; p <= n; ++p){
27                     b[i][j] += v[i][p]*vis[p][j];
28                 }
29             }
30         }
31         for (int i = 1; i <= n; ++i){
32             for (int j = 1; j <= n; ++j){
33                 v[i][j] = b[i][j];
34             }
35         }
36     }
37     cout<<v[1][n]<<endl;
38     return 0;
39 }

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

数列下标
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述

给出一个数列 A,求出一个数列B.
其中Bi   表示 数列A中 Ai 右边第一个比 Ai 大的数的下标(从1开始计数),没有找到这一个下标  Bi 就为0
输出数列B

输入描述:

第一行1个数字 n (n ≤ 10000)
第二行n个数字第 i 个数字为 Ai (0 ≤ A≤ 1000000000)

输出描述:

一共一行,第 i 个数和第 i+1 个数中间用空格隔开.
示例1

输入

复制
6
3 2 6 1 1 2

输出

复制
3 3 0 6 6 0

说明

样例不用解释

这题就用栈来模拟一下了。
 1 #include <bits/stdc++.h>
 2 #define test(a) cout<<a<<endl
 3 using namespace std;
 4 struct Node{
 5     int to,val;
 6 };
 7 stack<Node> sk;
 8 int an[10005];
 9 int n,x;
10 int main(){
11     cin>>n;
12     for (int i = 1; i <= n; ++i){
13         cin>>x;
14         if(sk.empty()){
15             sk.push(Node{i,x});
16         }else{
17             if(sk.top().val >= x){
18                 sk.push(Node{i,x});
19             }else{
20                 while(!sk.empty() && sk.top().val < x){
21                     an[sk.top().to] = i;
22                     sk.pop();
23                 }
24                 sk.push(Node{i,x});
25             }
26         }
27     }
28     for(int i = 1; i <= n; ++i){
29         cout<<an[i]<<" ";
30     }
31     cout<<endl;
32     return 0;
33 }

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

星光晚餐
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述

Johnson和Nancy要在星光下吃晚餐。这是一件很浪漫的事情

 

为了增加星光晚餐那浪漫的氛围,他拿出了一个神奇的魔法棒,并且可以按照一定的规则,改变天上星星的亮暗。

Johnson想考考Nancy,在他挥动魔法棒后,会有多少颗星星依旧闪耀在天空。他知道,Nancy一定会一口说出答案。

Nancy当然知道怎么做啦,但她想考考你!

Johnson先将天上n个星星排成一排,起初它们都是暗的。

他告诉他的妹子,他将挥动n次魔法棒,第i次挥动会将编号为i的正整数倍的星星的亮暗反转,即亮的星星转暗,暗的星星转亮。

Johnson想问Nancy,最终会有多少个星星依旧闪亮在天空。


输入描述:

一个整数n,含义请见题目描述。

输出描述:

一个整数ans,即n次操作后会有多少个星星依旧闪亮。
示例1

输入

复制
3

输出

复制
1
示例2

输入

复制
7

输出

复制
2

备注:

对于60%的数据:n≤2×10
6

对于100%的数据:n≤10
18
签到题
 1 #include <bits/stdc++.h>
 2 #define test(a) cout<<a<<endl
 3 #define ll long long int
 4 using namespace std;
 5 ll n,x;
 6 int main(){
 7     cin>>n;
 8     int ans = (int)sqrt(n);
 9     cout<<ans<<endl;
10     return 0;
11 }

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

括号序列
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

给定括号长度N,给出一串括号(只包含小括号),计算出最少的交换(两两交换)次数,使整个括号序列匹配。
我们认为一个括号匹配,即对任意一个')',在其左侧都有一个'('与它匹配,且他们形成一一映射关系。

输入描述:

第一行:整数N,表示括号序列长度
第二行:一个字符串,表示括号

输出描述:

一个整数,表示最少的交换次数
示例1

输入

复制
6
(()))(

输出

复制
1
示例2

输入

复制
6
)))(((

输出

复制
2

备注:

对于80%的数据:n≤3000
对于100%的数据,n≤5×10
6
 
类似签到题,走一遍字符串就行。
 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 string s;
 5 int n;
 6 int main(){
 7     ios::sync_with_stdio(0);
 8     cin.tie(0),cout.tie(0);
 9     cin>>n;
10     cin>>s;
11     int l = 0;
12     int ans = 0;
13     for(int i = 0; i < s.length(); i++){
14         if(s[i]=='(')
15             l++;
16         else{
17             if(l==0)
18                 ans++;
19             else
20                 l--;
21         }
22     }
23     int cnt = ans%2==0?ans/2:ans/2+1;
24     cout<<cnt<<endl;
25     return 0;
26 }

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

假的数学游戏
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

输入一个整数X,求一个整数N,使得N!恰好大于XX

输入描述:

第一行:一个整数X

输出描述:

第一行:一个整数N
示例1

输入

复制
7

输出

复制
10

备注:

每个测试点所对应的X满足:

第i个测试点输入的值为第i-1个测试点输入的值乘以10再加上7。

特别的,第一个测试点所输入的值为7。

提示:数据共有10组。

这题其实可以打表做。但是那样就是失去了做题的本意了。
所以最好的方法就是斯特林公式加二分查找。

两边加个log10。


 1 #include <bits/stdc++.h>
 2 
 3 #define ll long long int
 4 #define pi acos(-1)
 5 #define eps 1e-10
 6 #define e 2.718281828459
 7 using namespace std;
 8 
 9 int main(){
10     ll t;
11     cin>>t;
12     double ans = t*log10(t);
13     ll l = 1,r = 1e15;
14     while(r - l > 1){
15         ll mid = (l + r)>>1;
16         double cnt = log10(sqrt(2.0 * mid * pi)) + mid * log10(mid / e);
17         if(cnt - ans > eps){
18             r = mid;
19         }else{
20             l = mid;
21         }
22     }
23     cout<<r<<endl;
24     return 0;
25 }
原文地址:https://www.cnblogs.com/zllwxm123/p/9608207.html