#include #include using namespace std; int stack[100000]; //Стек для поиска в глубану int stend; //Конец стека int mark[1001]; //Массив пометок вершин для поиска в глубину int roads[1001][1001]; //Матрица смежности исходного графа int main(void) { int i, j; //Счётчики int N; //Количество городов int M; //Количество дорог int K; //Модуль int a, b; //Начало и конец дороги int components; //Количество компонент связности int nodes; //Количесиво вершин в текущей компоненте int current; //Текущая обрабатываемая вершина long long answer; //Ответ freopen("roads.in", "r", stdin); //Открываем входной файл freopen("roads.out", "w", stdout); //Открываем выходной файл cin>>N>>M>>K; //Считываем количество городов, дорог и модуль for (i=0; i>a>>b; //Считываем начало и конец дороги и roads[a][b]=1; //вносим соответствующие изменения roads[b][a]=1; //в матрицу смежности } components=0; //Первоначально найдено 0 компонент связности answer=1%K; //Начальное значение ответа for (i=1; i<=N; i++) //Перебираем все вершины if (!mark[i]) {//и если вершина ещё не обработана, то находим количество //вершин в её компоненте связности components++; //Увеличиваем число найденных компонент nodes=1; //Помечаем, что одну вершину в компоненте уже нашли stack[stend++]=i; //и добавляем её в стек, mark[i]=1; //помечая её как обработанную while (stend>0) {//Пока стек не пуст, current=stack[--stend]; //извлекаем из него вершину for (j=1; j<=N; j++) if (!mark[j] && roads[current][j]) {//и все необработанные вершины, //соединённые с текущей stack[stend++]=j; //добавляем в стек, mark[j]=1; //помечая как обработанные, nodes++; //и увеличиваем количество найденных в компоненте связности вершин } } answer=(answer*nodes)%K; //Увеличиваем ответ в размер компоненты раз по модулю K } if (components==1) answer=1%K; //Если компонента одна, то ответ равен 1 по модулю K, else for (i=0; i