Count Vowels Permutation in C++

Suppose we have one number n, we have to count how many strings of length n can be formed using these rules − Each character is a lower case vowel Each vowel 'a' may only be followed by an 'e'. Each vowel 'e' may only be followed by an 'a' or 'i'. Each vowel 'i' may not be followed by another 'i'. Each vowel 'o' may only be followed by an 'i' or 'u'. Each vowel 'u' may only be followed by an 'a'. The answer may be too large, so we will find the answer modulo 10^9 + 7.
So, if the input is like 2, then the output will be 10, this is because all possible strings are "ae", "ea", "ei", "ia", "ie", "io", "iu", "oi", "ou", "ua".
To solve this, we will follow these steps −
m = 1^9 + 7
m = 1^9 + 7
Define a function add(), this will take a, b,
Define a function add(), this will take a, b,
return ((a mod m) + (b mod m)) mod m
return ((a mod m) + (b mod m)) mod m
Define a function mul(), this will take a, b,
Define a function mul(), this will take a, b,
return ((a mod m) * (b mod m)) mod m
return ((a mod m) * (b mod m)) mod m
Define a function solve(), this will take n,
Define a function solve(), this will take n,
Define an array A of size: 5 x 5 := {{0,1,0,0,0},{1,0,1,0,0},{1,1,0,1,1},{0,0,1,0,1},{1,0,0,0,0}}
Define an array A of size: 5 x 5 := {{0,1,0,0,0},{1,0,1,0,0},{1,1,0,1,1},{0,0,1,0,1},{1,0,0,0,0}}
Define an array result of size: 5 x 5.
Define an array result of size: 5 x 5.
for initialize i := 0, when i < 5, update (increase i by 1), do −for initialize j := 0, when j < 5, update (increase j by 1), do −if i is same as j, then, result[i, j] := 1Otherwise,result[i, j] := 0
for initialize i := 0, when i < 5, update (increase i by 1), do −
for initialize j := 0, when j < 5, update (increase j by 1), do −if i is same as j, then, result[i, j] := 1Otherwise,result[i, j] := 0
for initialize j := 0, when j < 5, update (increase j by 1), do −
if i is same as j, then, result[i, j] := 1
if i is same as j, then, result[i, j] := 1
Otherwise,result[i, j] := 0
Otherwise,result[i, j] := 0
(decrease n by 1)
(decrease n by 1)
for initialize i := 1, when i <= n, update (increase i by 1), do −results = result * A
for initialize i := 1, when i <= n, update (increase i by 1), do −
results = result * A
results = result * A
sum := 0
sum := 0
for initialize i := 0, when i < 5, update (increase i by 1), do −for initialize j := 0, when j < 5, update (increase j by 1), do −sum := add(result[i, j], sum)
for initialize i := 0, when i < 5, update (increase i by 1), do −
for initialize j := 0, when j < 5, update (increase j by 1), do −sum := add(result[i, j], sum)
for initialize j := 0, when j < 5, update (increase j by 1), do −
sum := add(result[i, j], sum)
sum := add(result[i, j], sum)
return sum
return sum
Let us see the following implementation to get better understanding −
 Live Demo
#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
const lli m = 1e9+7;
lli add(lli a, lli b){
   return ((a%m) + (b%m))%m;
}
lli mul(lli a, lli b){
   return ((a%m) * (b%m))%m;
}
class Solution {
   public:
   void multiply(lli A[5][5], lli B[5][5]){
      lli C[5][5];
      for(lli i =0;i<5;i++){
         for(lli j=0;j<5;j++){
            lli temp =0;
            for(lli k =0;k<5;k++){
               temp = add(temp,mul(A[i][k],B[k][j]));
            }
            C[i][j] = temp;
         }
      }
      for(lli i =0;i<5;i++){
         for(lli j =0;j<5;j++){
            A[i][j] = C[i][j];
         }
      }
   }
   lli solve(lli n){
      lli A[5][5] = { { 0, 1, 0, 0, 0 }, { 1, 0, 1, 0, 0 }, { 1, 1,
      0, 1, 1 }, { 0, 0, 1, 0, 1 }, { 1, 0, 0, 0, 0 } };
      lli result[5][5];
      for (lli i = 0; i < 5; i++) {
         for (lli j = 0; j < 5; j++) {
            if (i == j)
               result[i][j] = 1;
            else
               result[i][j] = 0;
         }
      }
      n--;
      for (int i = 1; i <= n; i++)
      multiply(result, A);
      lli sum = 0;
      for (lli i = 0; i < 5; i++) {
         for (lli j = 0; j < 5; j++) {
            sum = add(result[i][j], sum);
         }
      }
      return sum;
   }
   int countVowelPermutation(int n) {
      return solve(n);
   }
};
main(){
   Solution ob;
   cout << (ob.countVowelPermutation(2));
}
2
10