diff --git a/Euler Totient Function/etf.cpp b/Euler Totient Function/etf.cpp index 5c99e1c..02891b1 100644 --- a/Euler Totient Function/etf.cpp +++ b/Euler Totient Function/etf.cpp @@ -8,15 +8,15 @@ void cal_etf() { for(int i = 1 ;i <= MAXN ; i++ ) etf[i]=i; - for(int i=2 ; i<= MAXN ; i++ ) - if ( etf[i] == i) - for(int j = 2*i ; j <= MAXN ; j += i) - etf[j] -= etf[j]/ i ; - - etf[1]=1; - for(int i=2 ; i<= MAXN ; i++) { - if ( etf[i]==i) //if that number is prime - etf[i] = i-1; + } + + for(int i=2;i<=MAXN;i++){ + if(etf[i]==i){ + etf[i]=i-1; + for(int j=2;j*i<=MAXN;j++){ + etf[j*i]=(1-(1/i)); + } + } } } diff --git a/Fibonacci/fast_doubling.cpp b/Fibonacci/fast_doubling.cpp index a157574..9724040 100644 --- a/Fibonacci/fast_doubling.cpp +++ b/Fibonacci/fast_doubling.cpp @@ -1,28 +1,45 @@ /* Fast Doubling Method - Fibonacci */ #include -#define REP(i,n) for (int i = 1; i <= n; i++) using namespace std; -typedef long long ll; +#define MOD 1000000007; +long long int a,b,c,d; -map F; - -ll m=1000000007; - -long long f(long long n) { - if (F.count(n)) - return F[n]; - long long k = n / 2; - if (n % 2 == 0) { // n=2*k - return F[n] = (f(k) * f(k) + f(k - 1) * f(k - 1)) % m; - } else { // n=2*k+1 - return F[n] = (f(k) * f(k + 1) + f(k - 1) * f(k)) % m; - } +void fast_fib(long long int n,long long int ans[]) +{ + if(n == 0) + { + ans[0] = 0; + ans[1] = 1; + return; + } + fast_fib((n/2),ans); + a = ans[0]; /* F(n) */ + b = ans[1]; /* F(n+1) */ + c = 2*b - a; + if(c < 0) + c += MOD; + c = (a * c) % MOD; /* F(2n) */ + d = (a*a + b*b) % MOD; /* F(2n + 1) */ + if(n%2 == 0) + { + ans[0] = c; + ans[1] = d; + } + else + { + ans[0] = d; + ans[1] = c+d; + } } int main() { - F[0] = F[1] = 1; - ll n;cin >> n; // This answers the term n - cout << f(n-1); + + long long int n; /* nth value to be found */ + cin>>n; + long long int ans[2]={0}; + fast_fib(n,ans); + cout<>elem; - //vector::iterator it = upper_bound(d.begin(),d.end(),elem); // non-decreasing - vector::iterator it = lower_bound(d.begin(),d.end(),elem); // strictly increasing - if(it == d.end()) d.push_back(elem); - else *it=elem; + d.push_back(elem); } - cout<=0;j--){ + if(d[i]>=d[j]){ + dp[i]=max(dp[i],dp[j]+1); + } + } + } + int ans=INT_MIN; + for(int i=0;i