Skip to content
Programming101
Programming101

Learn everything about programming

  • Home
  • CS Subjects
    • IoT – Internet of Things
    • Digital Communication
    • Human Values
  • Programming Tutorials
    • C Programming
    • Data structures and Algorithms
    • 100+ Java Programs
    • 100+ C Programs
  • HackerRank Solutions
    • HackerRank Algorithms Solutions
    • HackerRank C problems solutions
    • HackerRank C++ problems solutions
    • HackerRank Java problems solutions
    • HackerRank Python problems solutions
Programming101
Programming101

Learn everything about programming

HackerEarth Fibonacci with GCD problem solution

YASH PAL, 31 July 2024
In this HackerEarth Fibonacci with GCD problem solution, You are given N integers, A1, A2,…AN and Q queries. In each query, you are given two integers L and R(1 <= L <= R <= N). For each query, you have to find the value of:
GCD(F(Al),F(Al+1),F(Al+2)……F(AR))% 10^9 + 7
Can you do it?
HackerEarth Fibonacci with GCD problem solution

HackerEarth Fibonacci with GCD problem solution.

#include <bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<stdlib.h>
#include<iomanip>
#include<math.h>
#include<limits.h>
#include<string.h>
#include <ctime>
#include <deque>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<bitset>
#include<set>
#include <sstream>
#include <list>
#define mod 1000000007
#define MAX 100000000

using namespace std;
#define scan(a) scanf("%d",&a);
#define print(a) printf("%dn",a);
#define mem(a,v) memset(a,v,sizeof(a))
#define clr(a) memset(a,0,sizeof(a))
#define pb(x) push_back(x)
#define sort(a) sort(a.begin(),a.end())
#define inf 1e9
#define mp(a,b) make_pair(a,b)
#define V vector
#define S string
#define Gu getchar_unlocked
#define Pu putchar_unlocked
#define Read(n) ch=Gu(); while (ch<'0') ch=Gu(); n=ch-'0'; ch=Gu(); while (!(ch<'0')) {n=10*n+ch-'0'; ch=Gu();}
#define Write(n) r=n; chptr=s; *chptr=r%10+'0'; r/=10; for (; r; r/=10) {++chptr; *chptr=r%10+'0'; } Pu(*chptr); for (; chptr!=s; ) Pu(*--chptr);
typedef long long LL;
typedef long double LD;
typedef long L;
typedef pair<int,int> pii;
const double pi=acos(-1.0);
int arr[100010];
struct T
{
LL gc;
}tree[1000050];

LL gcd(LL a,LL b)
{
if(b==0)
return a;
else
return gcd(b,a%b);
}
void build(int node,int a,int b)
{
if(a==b)
{
tree[node].gc=arr[a];
return;
}
int mid=(a+b)>>1;
build(2*node,a,mid);
build(2*node+1,mid+1,b);
tree[node].gc = gcd(tree[2*node].gc,tree[2*node+1].gc);
return;
}
LL query(int node,int i,int j,int a,int b)
{
if(a<=i && b>=j)
{
return tree[node].gc;
}
if(b<i||a>j)
{
return -1;
}
int mid=(i+j)>>1;
LL t1=query(2*node,i,mid,a,b);
LL t2=query(2*node+1,mid+1,j,a,b);
if(t1==-1 && t2==-1)
return 1;
else if(t1==-1)
return t2;
else if(t2==-1)
return t1;
else
return gcd(t1,t2);
}
void multiply(LL f[2][2],LL m[2][2])
{
LL x = (f[0][0]*m[0][0] + f[0][1]*m[1][0])%mod;
LL y = (f[0][0]*m[0][1] + f[0][1]*m[1][1])%mod;
LL z = (f[1][0]*m[0][0] + f[1][1]*m[1][0])%mod;
LL w = (f[1][0]*m[0][1] + f[1][1]*m[1][1])%mod;

f[0][0] = x;
f[0][1] = y;
f[1][0] = z;
f[1][1] = w;
}
void power(LL f[2][2],LL n)
{
if(n==0||n==1)
return;
LL m[2][2]={{1,1},{1,0}};
power(f,n/2);
multiply(f,f);
if(n%2!=0)
multiply(f,m);
}
LL fib(LL n)
{
LL f[2][2]={{1,1},{1,0}};
if(n==0)
return 0;
power(f,n-1);
return (f[0][0]%mod);
}
int main()
{
ios_base::sync_with_stdio(false);
int n,q,a,b;
scanf("%d %d",&n,&q);
for(int i=0;i<n;i++)
scanf("%d",&arr[i]);
build(1,0,n-1);
while(q--)
{
scanf("%d %d",&a,&b);
a--;
b--;
int t1=query(1,0,n-1,a,b);
cout<<fib(t1)%mod<<endl;
}
return 0;
}

Second solution

#include<bits/stdc++.h>
#define MOD 1000000007
using namespace std;
int arr[100000];
int segtree[200000][3]={0};
int curmake;
int gcd(int a,int b)
{
if(a==0)
return b;
return gcd(b%a,a);
}
void makesegment(int nodenow,int l, int r)
{
if(l==r)
{
segtree[nodenow][0]=arr[l];
segtree[nodenow][1]=-1;
segtree[nodenow][2]=-1;
}
else
{
segtree[nodenow][1]=curmake;
curmake++;
makesegment(curmake-1,l,(l+r)/2);
segtree[nodenow][2]=curmake;
curmake++;
makesegment(curmake-1,(l+r)/2+1,r);
segtree[nodenow][0]=gcd(segtree[segtree[nodenow][1]][0],segtree[segtree[nodenow][2]][0]);
}
}
int findgcd(int at,int atl,int atr,int l,int r)
{
int a=-1,b=-1;
if(atl==l && atr==r)
return segtree[at][0];
if((atl+atr)/2>=l)
a=findgcd(segtree[at][1],atl,(atl+atr)/2,l,min(r,(atl+atr)/2));
if((atl+atr)/2+1<=r)
b=findgcd(segtree[at][2],(atl+atr)/2+1,atr,max(l,(atl+atr)/2+1),r);

if(a==-1)
return b;
if(b==-1)
return a;

return gcd(a,b);
}
void matmult(long long a[][2],long long b[][2],long long c[][2])
{
int i,j,k;
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
c[i][j]=0;
for(k=0;k<2;k++)
{
c[i][j]+=(a[i][k]*b[k][j]);
c[i][j]=c[i][j]%MOD;
}
}
}

}
long long matpow(long long a[][2],int n)
{
long long fib;
long long ans[2][2]={{1,0},{0,1}},temp[2][2];
int i,j;
while(n>0)
{
if(n&1)
{
matmult(ans,a,temp);
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
ans[i][j]=temp[i][j];
}
}
}
matmult(a,a,temp);
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
a[i][j]=temp[i][j];

}
}
n=n/2;
}
fib=(ans[0][0]*2+ans[0][1]);//modify here too
fib=fib%MOD;
return fib;
}

int main()
{

ios::sync_with_stdio(false);
int n,q;
cin>>n>>q;
assert(1<=n && n<=100000 && 1<=q && q<=100000);
int i;
for(i=0;i<n;i++)
{
cin>>arr[i];
assert(1<=arr[i] && arr[i]<=1000000000);
}
curmake=1;
makesegment(0,0,n-1);
while(q--)
{
long long int a[2][2]={{1,1},{1,0}};
int l,r;
cin>>l>>r;
assert(1<=l && l<=n && 1<=r && r<=n && l<=r);
l--;
r--;
int g=findgcd(0,0,n-1,l,r);
long long fib;
g--;
if(g>2)
fib=matpow(a,g-2);
else if(g>0)
fib=g;
else
fib=1;
cout<<fib<<endl;
}
return 0;
}
coding problems

Post navigation

Previous post
Next post
  • HackerRank Separate the Numbers solution
  • How AI Is Revolutionizing Personalized Learning in Schools
  • GTA 5 is the Game of the Year for 2024 and 2025
  • Hackerrank Day 5 loops 30 days of code solution
  • Hackerrank Day 6 Lets Review 30 days of code solution
©2025 Programming101 | WordPress Theme by SuperbThemes
Programming101
Programming101

Learn everything about programming

  • Home
  • CS Subjects
    • IoT – Internet of Things
    • Digital Communication
    • Human Values
  • Programming Tutorials
    • C Programming
    • Data structures and Algorithms
    • 100+ Java Programs
    • 100+ C Programs
  • HackerRank Solutions
    • HackerRank Algorithms Solutions
    • HackerRank C problems solutions
    • HackerRank C++ problems solutions
    • HackerRank Java problems solutions
    • HackerRank Python problems solutions