# CSUMD-TLE :(

i had my code, with the same solution as provided in the editorial, during the competition, sill getting TLE plzz help. what am, i doing wrong.

``````#include<stdio.h>
#include <vector>
#include<map>
#define REP(i,n) for (int i = 1; i <= n; i++)
using namespace std;
typedef unsigned long long ll;
typedef vector<vector<ll> > matrix;
inline void inp( ll &n )//fast input function
{
n=0;
ll ch=getchar();
while(  ch >= '0' && ch <= '9' )
n = (n<<3)+(n<<1) + ch-'0', ch=getchar();
}
#define MOD 10000000007ULL;
int K = 2;

inline matrix mul(matrix A, matrix B)
{
matrix C(K+1, vector<ll>(K+1));
C[1][1]=((A[1][1]*B[1][1])+ (A[1][2]*B[2][1]))%MOD;
C[1][2]=((A[1][1]*B[1][2])+ (A[1][2]*B[2][2]))%MOD;
C[2][1]=((A[2][1]*B[1][1])+ (A[2][2]*B[2][1]))%MOD;
C[2][2]=((A[2][1]*B[1][2])+ (A[2][2]*B[2][2]))%MOD;
/* REP(i, K) REP(j, K) REP(k, K)
C[i][j] = (C[i][j] + A[i][k] * B[k][j]) % MOD;*/
return C;
}
matrix pow(matrix A, ll p)
{
if (p == 1)
{
return A;
}
if ((p % 2)!=0)
{

return mul(A, pow(A, p-1));;
}
else
{
matrix X = pow(A, p/2);
return mul(X, X);
}
}
inline ll fib(ll N)
{
vector<ll> F1(K+1);
F1[1] = 1;
F1[2] = 3;
matrix T(K+1, vector<ll>(K+1));
T[1][1] = 0, T[1][2] = 1;
T[2][1] = 2, T[2][2] = 2;
if (N == 1)
return 1;
T = pow(T, N-1);
ll res = 0;
REP(i, K)
res = (res + T[1][i] * F1[i]) % MOD;
return res;

}

int main()
{
ll n,m,test;
inp(test);
for(;test>0;test--)
{
inp(n);
printf("%lld\n",fib(n));
}
return 0;
}``````

Iâ€™m not C++ expert, but Iâ€™d say, that `int[2][2]` is quicker than `vector[3][3]`, but first thing you can try, is to perform MOD operations only when needed:

replace:

``````C[1][1]=((A[1][1]*B[1][1])+ (A[1][2]*B[2][1]))%MOD;
``````

with

``````C[1][1]=(A[1][1]*B[1][1])+ (A[1][2]*B[2][1]);
if (C[1][1] >= MOD ) C[1][1] %= MOD;
``````

same in `fib` function

1 Like

I remember I too got a two TLE during the contest,then I rewrite the code,without using any STL .So as @betlista said, replacing the Vector(STL) with array will surely help u in Removing the TLE.

1 Like