@codeforces - 1205E @ Ожидаемое значение снова


@описание@

Даны два числа п, к, пусть s случайная строка символов размер набора к.

Определение F (S) представляет длину удовлетворяет S = S я предваряется номером г длины суффикса я по п.1 ≤ I <| S |.

Искомый F (S) ^ 2 желателен.

Ввод
только одна строка, содержащая два целых числа п, к (1≤n≤10 ^ 5, 1≤k≤10 ^ 9), то есть , как описано выше.

Выход
Выход желательно по модулю 10 ^ 9 + 7.

Примеры
Входные
данные 2 3
Выход
333333336

Ввод
1 5
Выход
0

Входные
данные 100 1
Выход
9801

Входные
данные 10 10
Выходные
412377396

@решение@

@part - 1 @

На самом деле, перед суффиксом равен указанному субъекту, то есть число границы.
Поскольку длина границы к длинам , эквивалентный п - к периодам, в целях облегчения последующего обсуждения, мы хотим , чтобы вычислить число циклов.

Пусть случайные переменные считаются \ (G_i (ы) \) , когда длина периода включает I S равен 1, и 0 в противном случае.
Может быть получен \ (F (S) = \ sum_ = {I} 1. 1} ^ {п -. G_i (S) \) , т.е., с учетом вклада каждой длины периода.
Может быть затем получены \ (E (F (S) ^ 2) = \ sum_ {= 1} ^ {N-1} \ sum_ {J = 1} ^ {N-1} E (g_i (ы) * £ _х ( S)) \) , линейный характер этого расчета может быть желательным.

Рассмотрим \ (Е (g_i (ы) * £ _х (ы)) \) , по существу , равна длине цикла , содержащего как длину ы я есть вероятность периода у.
Существует вывод: \ (Е (G_i (S) * £ _х (S)) = (\ FRAC {. 1} {К}) ^ {N- , \ тах (I + Jn, НОД (I, J))} \ ) . Я докажу , частично - с учетом 3.
Далее рассмотрим ответ на решение в случае этого заключения помещения.

@часть 2@

В соответствии с вышеуказанными идеями, мы хотим спросить \ (\ sum_ {я = 1 } ^ {п-1} \ sum_ {j = 1} ^ {п-1} (\ гидроразрыва {1} {к}) ^ { N- , \ макс (I + Jn, НОД (I, J))} \) .

Заметим , что это уравнение только с \ (S = I + J, D = НОД (I, J) \) связаны, но , так как \ (D | S \) , так что число кортежей (д, з) не больше , чем O (Nlog N) (гармонический ряд).
Мы попытались для каждой пары (д, з) вычисляется по количеству (I, J) удовлетворяет \ (S = I + J , , НОД (I, J) = D \) .

Так как \ (НОД (I, S) = НОД (I, S - I) = НОД (I, J) = D \) ( в зависимости от характера НОД), так что J фактически несущественно, единственное ограничение принимать I диапазон значений.
Надо только подсчитать число I , удовлетворяющее 1 <= I <= n - 1 и 1 <= с - я <= п-1 и \ (НОД (S, I) = D \) .

прямое решение неравенства, оно должно быть решение в любом случае интервалы. Только вы должны рассмотреть \ (НОД (s, я) = d \) случай.
Эта теория, с помощью инверсии Мебиуса, но на самом деле я просто нажмите нисходящий счет, перечислить каждый раз , удовлетворяющий р я | р | s, то ответ я ответ из включения и исключения р , Поскольку нисходящий расчет, обработка будет правильным ответ на р я , соответствующий определенный процесс выхода.

Сложность времени я | р | утраивает число таких х, грубый анализ должен быть \ (O (п \ лог ^ 2n) \) уровня.

@part - 3 @

Мы формально рассмотрим , как доказать \ (E (g_i (s) * £ _х (s)) = (\ гидроразрыва {1} {к}) ^ {п - \ тах (я + Jn, НОД (I, J))} \) .

Первый встроенный фиг п точек, если существует цикл длины х, соединение со всеми ребрами (у, у + х).
Вниз так подключено, то же самое значение блока передачи обязательно то же самое. Если предположить , что число блоков связи является с, то есть будет в общей сложности к ^ с различными строками.
И поскольку общее число строк к ^ п, то вероятность \ (\ гидроразрыва {к ^ C } {к ^ п} = (\ гидроразрыва {1} {к}) ^ {пс} \)

Во- первых, при I + J <= п, согласно леммы слабого периода (Кинзер строки поиска WC можно найти в Courseware), должна НОД (I, J) периода, число блоков , переданных с = НОД (я , к).
И потому , что я + J <время = п НОД (I, J) > 0> = I + J - п, поэтому наш ответ правильную формулу.

Далее рассмотрим I + J> п, потери общности, поэтому я> J. И потому , что я + J> п, так что я> п - к.
Сначала рассмотрим исходный цикл точек на дюйм я п соединенный длиной кромки, даже все (у, у + I). Даже количество такого сообщения блокировать некоторые из I, и представление циклов длины я в 0 ... I-1 для всех позиций (заметим , что это нумеруются от 0).
Это сообщение может нажмите показано на блок - циклов длины я в положении , чтобы блокировать коммуникации пронумерованы от 0 ... I-1.

Далее, для каждого из 0 <= г <п - J, мы даже (г, (г + J) по модулю I). Заметим , что г <п - J <I.
Каждое добавление ребра в случае не будет образовывать кольцо , такое , что число блоков , чтобы уменьшить связь. Но если формирование кольца, заключение не установлено.
Но даже вид сбоку выше факта, формирование перестановки в первой части, и этот тип замены при этом шаблон PolyA использовал его , чтобы задаться вопросом о природе:
(1) Если в конечной форме множества колец, кольца всех размеров должны это я / НОД (I, J) .
(2) при добавлении (г, (г + к) по модулю я) образует кольцо, то все ребра , затем добавляют с образованием кольца.
Таким образом, можно сделать вывод: Если кольцо образуется, то число блоков , переданных с обязательно НОД (I, J); и г образован из первого кольца = я - НОД (I, J ).

Таким образом, если г = я - НОД (я, к) <п - J, то есть, I + J - п <НОД ( I, J), то с = НОД (I, J) ; в противном случае, с = я - (п - к) = I + J - п .
На данный момент, наши выводы окажутся законченными.

@решение@

#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int MAXN = 100000;
const int MOD = int(1E9) + 7;
int gcd(int a, int b) {
    return (b == 0) ? a : gcd(b, a % b);
}
int pow_mod(int b, int p) {
    int ret = 1;
    while( p ) {
        if( p & 1 ) ret = 1LL*ret*b%MOD;
        b = 1LL*b*b%MOD;
        p >>= 1;
    }
    return ret;
}
int n, m, k, ans;
void update(int d, int s, int p) {
    ans = (ans + 1LL*p*pow_mod(k, MOD - 1 + max(s - n, d) - n)%MOD)%MOD;
}
vector<int>dv[2*MAXN + 5];
void init() {
    for(int i=1;i<=m;i++)
        for(int j=i;j<=m;j+=i)
            dv[j].push_back(i);
}
int f[2*MAXN + 5];
int main() {
    scanf("%d%d", &n, &k), m = 2*(n - 1);
    init();
    for(int s=1;s<=m;s++) {
        int l = max(1, s - (n - 1)), r = min(n - 1, s - 1);
        for(int j=dv[s].size()-1;j>=0;j--) {
            int d = dv[s][j], p = s / d;
            f[d] = r / d - (l - 1) / d;
            for(int k=1;k<dv[p].size();k++)
                f[d] = (f[d] + MOD - f[d*dv[p][k]])%MOD;
            update(d, s, f[d]);
        }
    }
/*
    for(int i=1;i<=n-1;i++)
        for(int j=1;j<=n-1;j++)
            update(gcd(i, j), i + j, 1);
*/
    printf("%d\n", ans);
}

@подробности@

E так оригинальной div1 воды.

Как , потому что я использовал вектор так , он работает очень медленно. , ,
Но не уверен , что, может быть , я мог бы быть Трудоемкость случайно больше писать о том , какой странной вещи. , , ,

рекомендация

отwww.cnblogs.com/Tiw-Air-OAO/p/11402012.html