版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jirryzhang/article/details/82722274
第一题
给出n,求最小的正整数m 使得LCM(1...n)==LCM(n+1...m)
/**
* 给出n 求最小的正整数m 使得LCM(1...n)==LCM(n+1...m)
* 推结论的题 直接是求小于等于n的素数次方数*2
*/
#include <iostream>
using namespace std;
const int MAXN = 1e6+5;
long long p[MAXN];
bool prime[MAXN];
int k;
void init()
{
k = 0;
memset(prime, 0, sizeof(prime));
prime[0] = prime[1] = 1;
for(auto i=2; i<MAXN; i++)
{
if(!prime[i])
{
p[k++] = i;
for(long long j=i*i; j<MAXN; j+=i)
prime[j] = 1;
}
}
}
int main()
{
init();
int n;
while(cin>>n)
{
int res = 2;
for(auto i=2; i<=n; i++)
{
if(!prime[i])
{
int sum = i;
while(sum <= n/i)
sum *= i;
res = max(res, (n/sum+1)*sum);
}
}
cout<<res<<endl;
}
return 0;
}
第二题
单向有环图,求满足要求的点(该点可达顶点数<可达该点的顶点数)的个数。用图的深度遍历可解。
考试的时候地点没选好,吵吵闹闹的,心态爆炸,竟然把标记已访问节点的数组给去掉了,遇到有环的case就把栈给爆了。
#include<iostream>
#include <vector>
#include <unordered_set>
using namespace std;
void Dfs(const vector<unordered_set<int>>& path,vector<int>& visited,unordered_set<int> & canVisit,int cur)
{
for(auto i=path[cur].begin();i!=path[cur].end();++i)
{
if(visited[*i]==0) {
visited[*i]=1;
canVisit.insert(*i);
Dfs(path, visited, canVisit, *i);
}
}
return ;
}
int main()
{
int n,m,u,v;
while(cin>>n>>m) {
vector<unordered_set<int>> path(n);
vector<unordered_set<int>> canVisit(n);
for(auto i=0;i<m;++i){
cin>>u>>v;
u-=1;
v-=1;
path[u].insert(v);
}
vector<int> beVisted(n,0);
for(auto i=0;i<n;++i){
vector<int> visited(n,0);
Dfs(path,visited,canVisit[i],i);
}
for(auto i=0;i<n;++i){
for(auto j:canVisit[i]){
++beVisted[j];
}
}
int cnt=0;
for(auto i=0;i<n;++i){
if(beVisted[i]>canVisit[i].size())
cnt++;
}
cout<<cnt<<endl;
}
}
第三题
输入三个数A、B、C。输出是否存在A的倍数d满足d%B==C。存在输出"YES",不存在输出"NO"。
把这道题目想复杂了,觉得case肯定会有很大的数(没有认真审题),所以没有用暴力枚举做,放弃了这道题。下面是暴力枚举的解法。
#include <iostream>
using namespace std;
int main() {
int n;
int a, b, c;
while(cin >> n){
for(auto i=0;i<n;++i) {
cin >> a >> b >> c;
int m = a - b;
bool r=false;
for(int x = 0; x < 1000; x++) {
for(int y = -1000; y < 1000; y++) {
if(x * m + y * a == c) {
r = true;
break;
}
}
}
cout << (r ? "YES" : "NO") << endl;
}
}
return 0;
}
另一种解法如下:
/**
* gcd求最大公约数,可用C++17的库函数
*/
#include<iostream>
#include <numeric>
using namespace std;
int main(){
int n;
int a,b,c;
while(cin>>n){
for(auto i=0;i<n;++i){
while(cin>>a>>b>>c){
if (c%gcd(a,b)==0)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
}
return 0;
}
题目都比较基础,为了省事在二餐西餐厅考的(一直听说二餐西餐厅是个阅读思考的好地方,结果被现实狠狠扇了一巴掌),结果到了11点好多人来吃饭,熙熙攘攘,又加上对第三题审题失误,觉得没法用暴力枚举解决大CASE的情况,心态爆炸,本来能AC的题都没AC。感觉跟心心念的鹅厂无缘了,凉凉...