2019.9.10

\ (1.bzoj \) \ (1008 \) побег

Значение вопросов:

Там \ (п \) позиция, \ (т \) число видов, число заполнения каждой позиции, так что две соседние позиции с одинаковым номером, спросили , сколько видов программ. Количество каждого номера не ограничено.

Анализ:

Значительные проблемы перестановки

Мы не рассматривали такое же условие числа соседних позиций, то в общей сложности
\ [т ^ п \]
виды программ, а затем вычесть количество каждой смежной позиции не равен общей программу.

Как вы считаете это?

М имеет первый личный выбор, потому что в течение второго лица, отличного от первого лица, и, следовательно, выбор м-1

Поскольку третий ко второму человеку разные, так что м-1 (количество второго лица удалены)

...

N-м-1 выбор отдельных лиц, так что в общей сложности
\ [т ^ нм * (м
-1) ^ {п-1} \] Виды программы

\(Код:\)

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
#define ll long long

const int mod=1e5+3;
ll fpow(ll a,ll b)
{
    ll ans=1;
    while(b)
    {
        if(b&1) ans=(ans*a)%mod;
        a=(a*a)%mod;
        b>>=1;
    }
    return ans;
}
int main()
{
    ll n,m;
    scanf("%lld%lld",&m,&n);//注意输入顺序
    ll res=(fpow(m,n)-m*fpow(m-1,n-1))%mod;
    while(res<mod) res+=mod;//要注意负数的处理
    printf("%d\n",res%mod);
}

Сбор урожая: преобразование дополнение, математический анализ, быстрая сила

\ (2.bzoj \) \ (1009 \) \ (GT \) экзамен

Значение вопросов:

А Сенг готов поступить в \ (GT \) экзамен, номер билета \ (N \) цифры \ (X1X2 .... Xn (0 <= Xi <= 9) \) , он не хочет , номер билета появляется несчастливое число. Его незадачливые математика \ (A1A2 ... Am (0 < = Ai <= 9) \) имеет М бит, не существует ни в коем случае \ (\ x1x2 ... Xn) не совсем период , равный \ (A1A2 .. .am. \) \ (А1 \) и \ (X1 \) может \ (0 \)

Анализ:

Прежде всего , может найти это проблема динамического программирования, мы устанавливаем \ (F (I, J) \) представляет назад я совпавшие символы первого несчастливого символа \ (J \) количество программных бит, ответ
\ [ ANS = \ sum_ {J = 0
} ^ {М-1} е [п] [J] \] Почему \ (М-1 \) это? Поскольку мы не можем появиться несчастливое число.

Такое совпадение строк, так что очень легко думать о \ (KMP \) или \ (AC \) автомат, потому что это только один матч и строка текстовых строк, не нужно использовать \ (AC \) автомат, с \ ( KMP \) на нем

Из \ (F (I, J) \) могут быть переданы \ (. 1 \) . \ (Р (I +. 1, J +. 1) 2.f (I +. 1, Следующая [J] +1) 3.f (я + 1,0) \)

А:
\ [. Р [I] , [Дж] = \ sum_ {k = 0} ^ {. М- 1} Р [I - 1] [K] * А [К] [Дж] \]
подсчитать , как \ (A ( K, J) \) это? Перечислим первые билета \ (я + 1 \) биты символов , которые могут возникнуть, то см \ (F (I, J) \) могут быть переданы , куда идти, а затем они передают этот путь передачи на матрице \ (1 + \) .

Эта форма очень похожа на умножение матриц, а затем посмотреть на нашем диапазоне данных \ (п - <= 1E9 \) , поэтому мы должны использовать матрицу для оптимизации быстрой мощности

Почему может быстро матрица мощности , чтобы оптимизировать его? Так как
\ [\ sum_ {к = 0
} ^ {М-1} [к] [J] \] является фиксированной величиной, так что часть нашей предварительной обработки.
\ [F (I, J) = F (I -1,0) * а (0, J
) + е (я-1,1) * а (1, к) + е (я-1,2) * а (2, к) ... \] мы нашел число столбцов являются одинаковыми, поэтому массив также отведенной е представляет собой матрицу
\ [(е [я] [ 0] \ четырехъядерных F [I] [1] \ четырехъядерных ...) = (F [i - 1] [0] \ четырехъядерных е [я-1] [1] \ четырехъядерных ...) * \ влево (\ BEGIN {матрица} a_ {00} и \ четырехъядерных a_ {01} ... \\ a_ {10 } & \ Quad а_ {11}
... \\ \ \\ cdots а_ {т-10} & \ четырехъядерных а_ {т-11} ... \\ \ конец {матрица} \ справа) \] матрица флэш оптимизация власти
\ [(F [N] [ 0] \ четырехъядерных е [п] [1] \ четырехъядерных ...) = (F [0] [0] \ четырехъядерных F [0] [1] \ четырехъядерных. ..) * \ влево (\ начать {матрица} a_ {00} и \ четырехъядерных a_ {01} ... \\ a_ {10} и \ четырехъядерных a_ {11} ... \\ \ cdots \\ a_ { м-10} & \ четырехъядерных а_
{т-11} ... \\ \ конец {матрица} \ справа) ^ {п} \] Однако, следующий код, строки и столбцы записываются анти

\(Код:\)

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;

int a[25][25],f[25][25];
char s[25][25];
int n,m;
int mod;
int nxt[maxn];

void mul(int b[25][25],int c[25][25],int d[25][25])
{
    int tmp[25][25];
    for(int i=0;i<m;++i)
    {
        for(int j=0;j<m;++j)
        {
            tmp[i][j]=0;
            for(int k=0;k<m;++k)
            {
                tmp[i][j]=(tmp[i][j]+b[i][k]*c[k][j])%mod;
            }
        }
    }
    for(int i=0;i<m;++i)
    {
        for(int j=0;j<m;++j)
        {
            d[i][j]=tmp[i][j];
        }
    }
}
template<class T>void read(T &x)
{
    bool f=0;char ch=getchar();x=0;
    for(;ch<'0'||ch>'9';ch=getchar()) if(ch=='-') f=1;
    for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
    if(f) x=-x;
}
int main()
{
    read(n);read(m);read(mod);
    scanf("%s",s+1);
    for(int i=2,j=0;i<=m;++i)
    {
        while(j&&s[i]!=s[j+1]) j=nxt[j];
        if(s[i]==s[j+1]) ++j;
        nxt[i]=j;
    }
    for(int i=0;i<m;++i)
    {
        for(int j=0;j<=9;++j)
        {
            int t=i;
            while(t&&s[t+1]!=j) t=nxt[t];
            if(s[t+1]-'0'==j) ++t;
            if(t<m) a[t][i]=(a[t][i]+1)%mod;//这里的行和列与我们定义的是相反的,这里是指从i转
        }                                  //移到t所有的方案数
    }
    for(int i=0;i<m;++i) f[i][i]=1;
    while(n)//矩阵快速幂加速
    {
        if(n&1) mul(f,a,f);
        mul(a,a,a);
        n>>=1;
    }
    int ans=0;
    for(int i=0;i<m;++i) ans=(ans+f[i][0])%mod;
    printf("%d\n",ans);
    return 0;
}

Завершение?

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

отwww.cnblogs.com/iwillenter-top1/p/11828199.html