4.7牛客校ACM选拔赛

A题
知识点:
任何数都是0的因数
0和0的公因数是0

#include<bits/stdc++.h>
using namespace std;
#define int long long

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
	int a,b;cin>>a>>b;
	cout<<a+b; 

    return 0;
}

B题
我研究出来一个公式,万物均可用字母来找等量关系,列方程试试

#include<bits/stdc++.h>
using namespace std;
#define int long long

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

	int a,b;cin>>a>>b;
	for(int i=1;i<=(b-a);i++)
	{
		if((b-a)%i==0&&i>a)
		{
			cout<<i-a;
			return 0;
		}
		
	}
	cout<<-1;

    return 0;
}


C题
前缀和直接搞
我代码屎山了....贴个韩顺哥的代码

#include<bits/stdc++.h>
using namespace std;
//#define int long long

signed main()
{
//    ios::sync_with_stdio(false);
//    cin.tie(nullptr);
    
	string s;cin>>s;
	
	int arr[100003][10]={0};
	for(int i=1;i<s.size()+1;i++)
	{
		arr[i][s[i-1]-'0']++;
		if(i<s.size()+1)
		{

				arr[i+1][0]=arr[i][0];
				arr[i+1][1]=arr[i][1];
				arr[i+1][2]=arr[i][2];
				arr[i+1][3]=arr[i][3];
				arr[i+1][4]=arr[i][4];
				arr[i+1][5]=arr[i][5];
				arr[i+1][6]=arr[i][6];
				arr[i+1][7]=arr[i][7];
				arr[i+1][8]=arr[i][8];
				arr[i+1][9]=arr[i][9];
			
		}
	}
	
	
//		for(int i=1;i<s.size()+1;i++)
//	{
//	
//		
//		
//			for(int j=0;j<10;j++)
//			{
//				cout<<arr[i][j]<<' ';
//			}
//		cout<<endl;
//	}
	
	
	
	int ans=0;
	for(int l=0;l<s.size();l++)
	{
		for(int r=l+1;r<s.size()+1;r++)
		{
			if(!(arr[r][0]-arr[l][0])&&arr[r][1]-arr[l][1]<=1&&arr[r][2]-arr[l][2]<=2&&arr[r][3]-arr[l][3]<=3&&arr[r][4]-arr[l][4]<=4&&arr[r][5]-arr[l][5]<=5&&arr[r][6]-arr[l][6]<=6&&arr[r][7]-arr[l][7]<=7&&arr[r][8]-arr[l][8]<=8&&arr[r][9]-arr[l][9]<=9)
				ans++;
			else
				break;
		}
	}
	cout<<ans<<endl;
	

    return 0;
}


#include <bits/stdc++.h>

using namespace std;
using i64 = long long;
#define int long long

void solve() {
    string s;cin>>s;
    int ans=0;
    vector<int> cnt(10);
    for(int l=0,r=0;r<s.size();r++){
        cnt[s[r]-'0']++;
        while(cnt[s[r]-'0']>s[r]-'0'){ //因为只有发生数量变化的数字才需要检验,其他的不需要再次检验,因为没变 
            cnt[s[l]-'0']--;//l去追r,会一直追到不满足条件,既然不满足了,后面r再往右,也不会和前面的组成符合条件的字符串 
            l++;//所以l可以++后停在那 
        }
        ans+=r-l+1;
    }
    cout<<ans<<"\n";
}

signed main() {
    std::ios::sync_with_stdio(false), std::cin.tie(nullptr);
    int t = 1;//std::cin >> t;
    while (t--) solve();
    return 0;
}



D题
就是找规律,规律就在素数上....(气炸了,考完两分钟出来了)
以后我代码写的再这么不严谨.....
尤其是字母,数字别写错!边界问题仔细举例模拟试试

#include<bits/stdc++.h>
using namespace std;
#define int long long

signed main()
{
	int a;cin>>a;
	if(a==0)
	{
		cout<<0;
		return 0;
		}	
	if(a==1)
	{
		cout<<1;
		return 0;
	}
	if(a==2)
	{
		cout<<2;
		return 0;
	}
	if(a==3)
	{
		cout<<2;
		return 0;
		}    
	int ans=0;
	for(int i=2;i<=(int)sqrt(a+1)+2;i++)
	{
		if((a+1)%i==0)
			ans=1;
	}
	if(ans==0)
	cout<<a;
	else
	cout<<0;


    return 0;
}


E题
题意:你有n种货币,老板也有n种,每种货币都是无限个。有几个商品,看你能不能买他,但是你付钱了,得让老板有的找,他要是找不了,那就不能买了。
思路:
初步思路:通过n个货币的拼凑,加减。把下面的值给凑出来
离散数学公式:gcd(a1​,a2​,a3​,⋯,an​)∣d⇔a1​x1​+a2​x2​+a3​x3​+⋯+an​xn​=d
n个数的最大公因数,如果这个数能被下面的数整除,那么下面这个数就可以通过n个数的拼凑得到
(0和任何数的最大公因数都是另一个数本身)
函数:
__gcd(x,y) //可以求最大公因数,但是不能用浮点型
//在C++17,不需要写前缀__了。gcd即可
//就不用再写其原型了:
int gcd(int a,int b) {
return b>0 ? gcd(b,a%b):a;
}
//没有直接求最小公倍数的函数
//但是,两数乘积除以最大公约数就是最小公倍数
实现:

#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
	int n,m,sum=0,_t=0;
	cin>>n>>m;
	vector<int>v(n+1);
	vector<int>v1(m+1);
	for(int i=1;i<=n;i++){
		cin>>v[i];
		sum=__gcd(sum,v[i]);
	}
    for(int i=1;i<=m;i++){
		cin>>v1[i];
	}
	int sum1=0,tt=0;
	if(sum==1){
		cout<<0<<endl;
		return 0;
	}
	for(int i=1;i<=m;i++){
	    if(v1[i]%sum!=0){
	    	sum1++;
		}
	}
	cout<<sum1<<endl;
} 

F题
题意:先给你一个a数组,然后输出b数组,b3,这个3经过2进制反转后,那个数字就是在a数组中对应的下标,输出这个下标对应的值即可
思路:
所以关键就是反转。
纯暴力即可,给你一个数组,把0到n,都反转一下,然后按顺序输出(在a中的位置)
如何反转:
右移到某一位,和1进行&,该位数字和1相&,若是1就是1,若是0就是0。至于前面的位数,由于下面都是0,所以结果都是0。(全真才真)
实现:

#include<bits/stdc++.h>
using namespace std;
#define int long long

int n;
int a[1 << 21], p[1 << 21];
int t = 0;

int cal(int x) {//x是从0到8 就是每个数字的下标 
	int num = 0;
	vector<int> tmp;
	for (int j = t - 2; j >= 0; j --) {//t是一共多少次幂 
		tmp.push_back((x >> j) & 1);//
	}
	
	int c = 0;
	for (auto t : tmp) {
		if (t) {
			num += (1 << c);
		}
		c ++;
	}
	return num;
}
signed main(){
	cin.tie(0), cout.tie(0), ios::sync_with_stdio(false);
	cin >> n;//n个数字 
	for (int i = 0; i < n; i ++) {
		cin >> a[i];//输入a数组 
	}
	
	int tmp = n;
	while (tmp) {
		tmp >>= 1;//除以2 
		t ++;//看这个n是2的几次幂 
	}
	
	for (int i = 0; i < n; i ++) {
		p[i] = cal(i);//从0到8? 
	}
	
	for (int i = 0; i < n; i ++) {
		cout << a[p[i]] << ' ';
	}
	cout << endl;
	return 0; 
} 
posted @ 2024-04-07 23:49  涤生yang  阅读(23)  评论(0)    收藏  举报