2021SDNU省赛选拔赛赛后总结

B.Complete Number Upgrade

一开始就没有坚定的想让它从1一直跑到1e8的想法,再加上算法时间复杂度很高,不能短时间内跑出来,所以成了所有队伍里面唯一一个没有A出来这道题的队。。。
u1s1太丢人了!!
AC代码:

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

int main(){
    
    
	cout << "6 28 496 8128 33550336" << endl;
	return 0;
}

我们自己找数的代码:

#include <bits/stdc++.h>
#include<cmath>

using namespace std;


int main()
{
    
    
	for(int i=1;i<=400000000;i++)
	{
    
    
		int sum=0;
		for(int j=1;j<i;j++)
		{
    
    
			if(i%j==0) sum+=j;
		 } 
		 if(sum==i)cout<<i<<'\n';
	}
	return 0;
}

师哥找数的代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll ; 
const int M = 1e8;
ll s[M + 5];
void work(){
    
    
	for(int i = 1; i <= M; ++i){
    
    
		for(int j = 1; i * j <= M; ++j){
    
    
			s[i * j] += i;
		}
	}
	for(int i = 1; i <= M; ++i){
    
    
		if(i * 2 == s[i]){
    
    							
			printf("%d\n", i);
		}
	}
}

int main(){
    
    	
	work();
	return 0;
}

明显他们利用类似于线性筛的思想,每次只划去i的倍数,而我们自己的却每次都要重新遍历。。
哪个算法时间复杂度高就一目了然了。

C.Decryption

这道题要先找出题目中的“s”代表的究竟是什么。
可以用a~z一个一个的试,也可以灵机一动:
在这里插入图片描述
根据题目里的这句话猜。什么字母可以单独成一个单词?
显然是“a”,所以就猜s是a。
才出来s就是a之后,写一个代码用来翻译c题的题面。
翻译完之后!令人吐血的事情来了!!前面一大堆不知道哪里抄来的废话,看也看不懂。。只有最后一段话是有用的。
历经千辛万苦翻译出来题目的我们天真的以为这题肯定就是题目有坑,看懂题目就完事了。
于是认为a/b%p真的就是a/b%p。。!!
后来才发现,原来是逆元TAT,而且就是逆元的板子题。
我们自己写的翻译题面的代码:

#include <bits/stdc++.h>
#include<cmath>

using namespace std;

string s;

int main()
{
    
    
	while(cin >> s)
	{
    
    
		int len = s.length();
		for(int i=0;i<len;i++)
		{
    
    
			if(s[i]>='a'&&s[i]<='z') s[i]=((s[i]-'a')+8)%26+'a';
			else continue;
		}
		cout<<s<<'\n';
	}
	
	return 0;
}

下面是我们自己写的AC代码:

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

typedef long long ll;
ll mod, s, t, m; 

ll quickpow(ll a, ll b)//精华就是快速幂 
{
    
    
	if(b < 0) return 0;
	ll ret = 1;
	a %= mod;
	while(b)
	{
    
    
		if(b & 1) ret = (ret * a) % mod;//mod是要模的值。 
		b >>= 1;
		a = (a * a) % mod;
	 }
	 return ret; 
}

ll inv(ll a){
    
    
	return quickpow(a, mod - 2);
}

int main()
{
    
    
	cin >> s >> t >> mod;
	m = inv(t);
	cout << s * m % mod << endl;		
	

	return 0;
}

师哥的翻译题面的代码:

#include <bits/stdc++.h>
using namespace std;
char secretKey = 's';
void work(){
    
    
	string s;
	while(getline(cin, s)){
    
    
		for(int i = 0; i < s.size(); ++i){
    
    
			if('a' <= s[i] && s[i] <= 'z'){
    
    
				s[i] = ((s[i] - 'a' - (secretKey - 'a')) % 26 + 26) % 26 +'a';
			}
			cout << s << "\n";
		}
// cout << "### Hint" << "\n";
// cout << "The problem above has been encrypted with a single lowercaseletters s\n";
// cout << "The encryption method is as follows:\n";
// cout << "For every character\n";
// cout << "If this character ch is a lowercase letter then change it to(ch - 'a' + s - 'a') % 26 + 'a';\n";
// cout << "else do not change this character.\n";
	}
}
 
int main(){
    
    
	freopen("input.txt", "r", stdin);
	// freopen("..\\encryptedProblem.md", "r", stdin);
	// freopen("..\\decryptedProblem.md", "w", stdout);
	work();
	return 0;
}

师哥的AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll quick(ll a, ll b, ll p)
{
    
    
	ll s = 1;
	while(b)
	{
    
    
		if(b & 1) s = s * a % p;
		a = a * a % p;
		b >>= 1;
	}
	return s % p;
}

ll inv(ll n, ll p)
{
    
    
	return quick(n, p - 2, p);
}

void work()
{
    
    
	ll a, b, p; scanf("%lld %lld %lld", &a, &b, &p);
	printf("%lld\n", a * inv(b, p) % p);
}

int main()
{
    
    
	work();
	return 0;
}

J.Prime

这题考哥德巴赫猜想:任一大于2的整数都可写成三个质数之和。以及卡了一波long long。。。
int的范围是 -231~231-1。到不了231!!所以要开long long呜呜。就因为这一个数字卡了我们好久!!一直到快结束才做出来。明明还没有人a出来的时候我们就想出来怎么做了。TAT。一定要牢记int和long long范围啊!!
AC代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

ll n, t;

int main(){
    
    
	cin >> t;
	while(t--){
    
    
		cin >> n;
		if(n < 8) cout << "-1" << endl;
		else cout << "2" << endl;
	}
	return 0;
}

K.Selection

水题。看真子集数目。
不写代码了!

猜你喜欢

转载自blog.csdn.net/LXC_007/article/details/115467567