ITRIX12E - R Numbers SPOJ Solution

#include <bits/stdc++.h>
using namespace std;
int n=10;
long long mod=1000000007;
void mult(vector<vector<long long> > &a,vector<vector<long long> > b){
    if(a.size()==0){
        a=b;
        return;
    }
    vector<vector<long long> > c(n,vector<long long>(n));
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            for(int k=0;k<n;k++){
                c[i][j]+=a[i][k]*b[k][j];
                c[i][j]%=mod;
            }
        }
    }
    a=c;
}
void exp(vector<vector<long long> > &a,int m){
    if(m<=1)return;
    vector<vector<long long> > c;
    while(m){
        if(m&1){
            mult(c,a);
        }
        mult(a,a);
        m>>=1;
    }
    a=c;
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(NULL);
    int t=1;
    cin>>t;
    while(t--){
        int N;
        cin>>N;
        if(N==0){
            cout<<0<<'\n';
            continue;
        }
        else if(N==1){
            cout<<4<<'\n';
            continue;
        }
        int a[20]={0};
        a[2]=a[3]=a[5]=a[7]=a[11]=a[13]=a[17]=a[19]=1;
        int c=0;
        vector<vector<long long> > g(10,vector<long long>(10)),h;
        g[0]={1,1,1,1,1,1,1,1,1,1};
        for(int i=1;i<10;i++){
            for(int j=1;j<10;j++){
                g[i][j]=a[i+j];
            }
        }
        exp(g,N-1);
        for(int i=0;i<10;i++){
            for(int j=0;j<10;j++){
                c+=g[i][j];
                c%=mod;
            }
        }
        cout<<(c-6+mod)%mod<<'\n';
    }
    return 0;
}

Comments