版权声明:本人ZZU在校学生,文章均为个人心得,有不足之处请不吝赐教! https://blog.csdn.net/whl_program/article/details/82731631
这道题有点难理解,是Topcoder SRM 661 (Div.1) 250 MissingLCM – 数论原题
点击查看题解
代码:
#include <bits/stdc++.h>
using namespace std;
int MAX(int a, int b){
return a > b ? a : b;
}
vector<int> primes(int n){//得到小于n的质数数组
vector<int> res;
vector<bool> arr(n+1, false);
for(int i = 2; i <= n; i++){
if(!arr[i]){
for (int j=2*i; j<=n; j+=i)
arr[j] = true;
res.push_back(i);
}
}
return res;
}
int exponent(int a, int b){//求指数
int res = 0;
while(a%b == 0){
a /= b;
res++;
}
return res;
}
int getMin(int n){
int res = 2;
vector<int> arr = primes(n);
for(int i=0; i<arr.size(); i++){
int maxExponent = 0;
int temp = arr[i];
while(temp <= n) {
maxExponent = MAX(maxExponent, exponent(temp, arr[i]));
temp += arr[i];
}
while (exponent(temp, arr[i]) < maxExponent){
temp += arr[i];
}
res = MAX(res, temp);
}
return res;
}
int main()
{
int n;
cin >> n;
cout << getMin(n) << endl;
return 0;
}
当时没做出来,只30%通过率,后来用队列加以改进,自己的测试样例没问题,只是没有提交
计算出度和入度主要是不仅需要计算紧紧相连的点,还需要计算间接相连的点
visit数组统计已经记录过得节点,防止自环陷入死循环
代码:
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <queue>
using namespace std;
struct GraphNode{
int label;
vector<GraphNode *> neighbor;//节点能够直接到达的城市 直接出度
vector<GraphNode *> gety;//能够直接到达该节点的城市 直接入度
GraphNode(int x) : label(x) {};
};
//利用队列计算节点出度
int get_x(vector<GraphNode *> graph, int i, vector<int> visit){
visit[i] = 1;
int counts = 0;
queue<GraphNode *> data;
data.push(graph[i]);
while(!data.empty()){
GraphNode *p = data.front();
data.pop();
for(int j=0; j < p->neighbor.size(); j++){
if(visit[p->neighbor[j]->label] == -1){
data.push(graph[p->neighbor[j]->label]);
visit[p->neighbor[j]->label] = 1;
counts++;
}
}
}
return counts;
}
//利用队列计算节点入度
int get_y(vector<GraphNode *> graph, int i, vector<int> visit){
visit[i] = 1;
int counts = 0;
queue<GraphNode *> data;
data.push(graph[i]);
while(!data.empty()){
GraphNode *p = data.front();
data.pop();
for(int j=0; j<p->gety.size(); j++){
if(visit[p->gety[j]->label] == -1){
data.push(graph[p->gety[j]->label]);
visit[p->gety[j]->label] = 1;
counts++;
}
}
}
return counts;
}
int fun(vector<GraphNode *> graph, vector<int> visit){
int result = 0;
for(int i=0; i<graph.size(); i++){
int x = get_x(graph,i,visit);//计算节点出度
int y = get_y(graph,i,visit);//计算节点入度
cout << x << " " << y << endl;
if(x < y)
result++;
}
return result;
}
int main()
{
int n, m;
vector<pair<int,int>> data;
cin >> n >> m;
for(int i=0; i<m; i++){
int a, b;
cin >> a >> b;
data.push_back(make_pair(a, b));
}
vector<GraphNode *> graph;
vector<int> visit;//记录已经遍历过的节点
for(int i=0; i<n; i++){
graph.push_back(new GraphNode(i));
visit.push_back(-1);
}
for(int i=0; i<data.size(); i++){
int begin = data[i].first;
int end = data[i].second;
graph[begin-1]->neighbor.push_back(graph[end-1]);
graph[end-1]->gety.push_back(graph[begin-1]);
}
int res = fun(graph, visit);
cout << res;
}
直接暴力了。。。
#include <bits/stdc++.h>
using namespace std;
int n;
bool foo(vector<int>& arr) {
for(int i = 1; i < 80; ++i){
if((arr[0]*i) % arr[1] != arr[2])
continue;
return true;
}
return false;
}
int main()
{
cin >> n;
vector<vector<int>> arr(n);
int temp;
for(int i=0; i<n; ++i){
for(int j=0; j<3; ++j){
cin >> temp;
arr[i].push_back(temp);
}
}
for(int i=0; i<n; ++i){
if(foo(arr[i]))
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}