这道题有点难理解,是Topcoder SRM 661 (Div.1) 250 MissingLCM – 数论原题
点击查看题解
代码:
#include
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; iint 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
#include
#include
#include
#include
using namespace std;
struct GraphNode{
int label;
vector neighbor;//节点能够直接到达的城市 直接出度
vector gety;//能够直接到达该节点的城市 直接入度
GraphNode(int x) : label(x) {};
};
//利用队列计算节点出度
int get_x(vector graph, int i, vector<int> visit){
visit[i] = 1;
int counts = 0;
queue 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 graph, int i, vector<int> visit){
visit[i] = 1;
int counts = 0;
queue data;
data.push(graph[i]);
while(!data.empty()){
GraphNode *p = data.front();
data.pop();
for(int j=0; jgety.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 graph, vector<int> visit){
int result = 0;
for(int i=0; iint 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;
vectorint ,int>> data;
cin >> n >> m;
for(int i=0; iint a, b;
cin >> a >> b;
data.push_back(make_pair(a, b));
}
vector graph;
vector<int> visit;//记录已经遍历过的节点
for(int i=0; inew GraphNode(i));
visit.push_back(-1);
}
for(int i=0; iint 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
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; ifor(int j=0; j<3; ++j){
cin >> temp;
arr[i].push_back(temp);
}
}
for(int i=0; iif(foo(arr[i]))
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}