B - Ignatius’s puzzle
题意: f ( x ) = 5 ∗ x 13 + 13 ∗ x 5 + k ∗ a ∗ x f(x)=5*x^{13}+13*x^{5}+k*a*x f(x)=5∗x13+13∗x5+k∗a∗x对于给定的k,对任意x,求最小非负整数的a使得65可以整除f(x)
思路:
费马小定理:假如p是质数,且Gcd(a,p)=1,那么 a^(p-1) ≡1(mod p)。即:假如a是整数,p是质数,且a,p互质(即两者只有一个公约数1),那么a的(p-1)次方除以p的余数恒等于1。
#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
typedef long long ll;
int main()
{
int k;
while (scanf("%d", &k) != EOF)
{
bool flag = false;
for (int i = 0; i <= 65; i++)
if (k * i % 5 == 2 && k * i % 13 == 8)
{
flag = true;
printf("%d\n", i);
break;
}
if (!flag)printf("no\n");
}
}
C - Rank of Tetris
题意:
给定一组关系,判断是否能构成他们的相对排名,如果可以就输出OK,不可以则根据情况输出冲突或信息不完全
思路:
可以很明显看出这种排名问题就可以转化为拓扑排序,唯一需要注意的就是等号的情况,显然不能转化为大于和小于的情况,因为这样会构成环,也就不符合我们使用拓扑排序的做法了,对于等号的情况我们仔细一想可以发现,可以把所有等于关系的点缩成一个点,也就是一个集合,所以可以采用并查集,把等号关系的合并,其余的走一遍拓扑排序就可以了,注意条件的输出的顺序。当队列里有超过一个元素时就是由于信息不全而造成的无法判断。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<string.h>
#include<stack>
#include<math.h>
#include<stdio.h>
#include<vector>
#include<queue>
using namespace std;
const int MAXNODE = 1e4 + 6;
const int MAXEDGE = 2e4 + 6;
typedef long long ll;
int fa[MAXNODE], in[MAXNODE];
vector<int>edge[MAXEDGE];
int n, m, N;
int find(int x)
{
return fa[x] == x ? fa[x] : fa[x] = find(fa[x]);
}
void merge(int x, int y)
{
int fx = find(x), fy = find(y);
if (fx != fy)
{
fa[fx] = fy;
n--;
}
}
void topo()
{
queue<int>q;
bool flag = true;
for (int i = 0; i < N; i++)
if (!in[i] && fa[i] == i)
q