Pagini recente » Cod sursa (job #1584049) | Cod sursa (job #2410930) | Cod sursa (job #1440525) | Autentificare | Cod sursa (job #1534487)
// O(sigma ^ 3 * log(n))
#include <fstream>
#include <array>
#include <numeric>
using namespace std;
constexpr long long mod = 104659;
constexpr int sigma = 26;
using mat = array<array<int, sigma>, sigma>;
mat mult(const mat& a, const mat& b){
mat rez = {}, tr = {};
for(int i = 0; i < sigma; ++i){
for(int j = 0; j < sigma; ++j){
tr[i][j] = b[j][i]; } }
for(int i = 0; i < sigma; ++i){
for(int j = 0; j < sigma; ++j){
long long tmp = 0;
for(int k = 0; k < sigma; ++k){
tmp += (long long)a[i][k] * (long long)tr[j][k]; }
rez[i][j] = tmp%mod; } }
return rez; }
mat exponent(mat baza, int x){
mat rez = {};
for(int i = 0; i < sigma; ++i){
rez[i][i] = 1; }
for( ; x > 0; x /= 2, baza = mult(baza, baza)){
if(x%2 == 1){
rez = mult(baza, rez); } }
return rez; }
int main(){
ifstream f("nrcuv.in");
ofstream g("nrcuv.out");
int n, m;
f >> n >> m;
mat graf;
for(int i = 0; i < sigma; ++i){
for(int j = 0; j < sigma; ++j){
graf[i][j] = 1; } }
for(int i = 0; i < m; ++i){
char a, b;
f >> a >> b;
a -= 'a', b -= 'a';
graf[a][b] = graf[b][a] = 0; }
const auto mat_rez = exponent(graf, n-1);
long long rez = 0;
for(int i = 0; i < sigma; ++i){
for(int j = 0; j < sigma; ++j){
rez += (long long)mat_rez[i][j]; } }
g << (rez%mod);
return 0; }