牛客OI赛制测试赛2

比赛链接:点我

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

题目描述
给出一个二元组(A,B)
求出无序二元组(a,b) 使得(a|A,b|B)的组数
无序意思就是(a,b)和(b,a) 算一组.
输入描述:
第一行数据组数 T(1≤T≤10000)
接下来T行,每行两个正整数 A,B(1≤A,B≤10000)
输出描述:
共T行,每行一个结果

组合,求A和B的因子个数,乘起来,减去他们最大公约数的因子的组合数,组合数为n*(n-1)/2

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 7;
int num[maxn];
int count(int n)///求因子的个数
{
    int s=1;///记录总共的素因子的个数
    for(int i=2;i*i<=n;i++)
        if(n%i==0)
    {
        int a=0;///记录的是每个素因子的个数
        while(n%i==0)
        {
            n/=i;
            a++;
        }
        s=s*(a+1);
    }
    if(n>1)
        s=s*2;
    return s;
}
 
int main(){
    for(int i = 1; i < maxn; i++) {
        for(int j = i; j < maxn; j += i)
            num[j]++;
    }//一种求因子的方法 
    
    int T, a, b; 
	scanf("%d", &T);
    while(T--) {
        scanf("%d%d", &a, &b);
        int t = __gcd(a, b);
       
        printf("%lld\n", 1ll * count(a) * count(b) - 1ll*(count(t) - 1) * count(t) / 2);
    }
    return 0;
}

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

题目描述
给出一个 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行,为一个邻接矩阵
输出描述:
题目中所求的数目

离散数学题,矩阵自乘k次就能知道几号点到几号点的长度为k的路径有几条

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#define MA 50  
typedef long long ll; 
ll G[MA][MA], mu[MA][MA], g[MA][MA];  
int main(){
  
    int n, m;  
    int i, j, k;  
    ll num;  
    scanf("%d%d",&n,&m);
    for(i=0; i<n; i++){  
        for(j=0; j<n; j++){  
            scanf("%lld", &G[i][j]);  
            g[i][j] = G[i][j];  
        }  
    }  
    while(--m){  
    
        memset( mu, 0, sizeof(mu));  
        for(i=0; i<n; i++){  
            for(j=0; j<n; j++){  
                for(k=0; k<n; k++){  
                    mu[i][j] += g[i][k] * G[k][j];  
                }  
            }  
        }  
        for(i=0; i<n; i++){  
            for(j=0; j<n; j++){  
                G[i][j] = mu[i][j];  
            }  
        }  
    }  
    num = 0;  
    num=G[0][n-1];
    
    printf("%lld\n",num);  
    
    return 0;  
} 

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

题目描述
给出一个数列 A,求出一个数列B.
其中Bi 表示 数列A中 Ai 右边第一个比 Ai 大的数的下标(从1开始计数),没有找到这一个下标 Bi 就为0
输出数列B
输入描述:
第一行1个数字 n (n ≤ 10000)
第二行n个数字第 i 个数字为 Ai (0 ≤ Ai ≤ 1000000000)
输出描述:
一共一行,第 i 个数和第 i+1 个数中间用空格隔开.

暴力

#include<iostream>
#include<cstdio>
using namespace std;
const int N=10000+100;
int a[N]; 
int b[N];

int main(){
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
		
	}
	int num;
    for(int i=0;i<n;i++){
    	for(int j=i+1;j<n;j++){
    		if(a[j]>a[i]){
    			b[i]=j+1;
    			break;
			} 
		}
	}
	for(int i=0;i<n;i++){
		if(i!=n-1){
			printf("%d ",b[i]);
		}
		else{
			printf("%d",b[i]);
		}
		
	}
	
}

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

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

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

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

Nancy当然知道怎么做啦,但她想考考你!
Johnson先将天上n个星星排成一排,起初它们都是暗的。

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

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

输入描述:
一个整数n,含义请见题目描述。
输出描述:
一个整数ans,即n次操作后会有多少个星星依旧闪亮。

这个题知道真相的我眼泪掉下来,因为只有因子个数为奇数的才亮,然后只有完全平方数有奇数个因子,推导详见:传送门

#include<cstdio>
#include<cmath>
long long n;
int main()
{
    scanf("%lld",&n);
    printf("%lld",(long long)(sqrt(n)));
}

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

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

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 5e6 + 10;
char s[N];
int n;
 
int main() {
    scanf("%d%s", &n, s + 1);
    int cnt = 0;
    for(int i = 1 ; i <= n ; ++ i) {
        if(s[i] == '(') ++ cnt;
        else {
            if(cnt) -- cnt;
            
        }
    }
    
    printf("%d\n", (cnt+1)/ 2 );
}

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

题目描述
输入一个整数X,求一个整数N,使得N!恰好大于XX。

输入描述:
第一行:一个整数X
输出描述:
第一行:一个整数N

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

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

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

提示:数据共有10组。
我就是斯特林公式打表,然后可能写错了,打表失败,算了直接贴大佬的二分算了

#include<bits/stdc++.h>
typedef long long ll;
 
using namespace std;
const double pi = acos(-1), e = exp(1.0);
ll x;
double up;
bool check(double n){
    return 0.5 * log(2 * pi * n) + n * log(n / e) >= up;
}
int main() {
    scanf("%lld",&x);
    up = x * log(x);
    int times = 51;
    double l = 1, r = 1e13, ans;
    while(times--) {
        ll mid = (l + r) / 2;
        if(check(mid)) ans = mid, r = mid;
        else l = mid;
    }
    cout <<(long long )ans;
    return 0;
}
#include <iostream>
#include <cstdio>
#include <cmath>
  
using namespace std;
  
int main()
{
    long long x;
      
    cin>>x;
      
    long long l=x,r=x*3,mid;
     
    while (l<r)
    {
        mid=(l+r)/2;
        if (log(mid*1.0)*mid-mid+log(x)-1<x*log(x))
        {
            l=mid+1;
        }
        else
        {
            r=mid;
        }
    }
     
    cout<<l;
      
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值