Skip to content
Programmingoneonone
Programmingoneonone

Learn everything about programming

  • Home
  • CS Subjects
    • Internet of Things (IoT)
    • 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
Programmingoneonone
Programmingoneonone

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 solutions

Post navigation

Previous post
Next post

Pages

  • About US
  • Contact US
  • Privacy Policy

Follow US

  • YouTube
  • LinkedIn
  • Facebook
  • Pinterest
  • Instagram
©2025 Programmingoneonone | WordPress Theme by SuperbThemes