/**Bismillahir Rahmanir Rahim.**/ #include <bits/stdc++.h> using namespace std; long long ara[52][52]; long long nCr(int n, int r) { if(n == r) return 1; if(r == 1) return n; if(ara[n][r]!=0) return ara[n][r]; return ara[n][r] = nCr(n-1, r) + nCr(n-1, r-1); } int main() { int n = 50, r = 25; long long ans = nCr(n, r); cout << ans << endl; return 0; }
Showing posts with label ডেটা স্ট্রাকচার. Show all posts
Showing posts with label ডেটা স্ট্রাকচার. Show all posts
ফেক্টরিয়ালের পেছনের ০ (Trailing Zeros on Factorial)
Standard/**Bismillahir Rahmanir Rahim.**/ #include <bits/stdc++.h> using namespace std; int zero(int x) { int ans = 0; for(int i=5; x/i>0;i*=5) ans += x/i; return ans; } int main() { int n; cin >> n ; cout << zero(n) << endl; return 0; } int main() { int ans = bigMod(4, 100001, 1234); cout << ans << endl; return 0; }
বিগমড (Bigmod)
Standard/**Bismillahir Rahmanir Rahim.**/ #include <bits/stdc++.h> using namespace std; int bigMod(int a, int n, int m) { //here, a, n and m refer to (a^n)%m if(n==0) return 1 % m ; int x = bigMod(a, n/2, m); x = (x*x) % m; if(n%2) x = (x*a)%m; return x%m; } int main() { int ans = bigMod(4, 100001, 1234); cout << ans << endl; return 0; }
অয়লার এর টোশেন্ট ফাংশন (Euler's Totient Function) {শুধুমাত্র একটি সংখ্যা n এর জন্য}
Standardn এর থেকে ছাট বা সমান এমন কতগুলি সংখ্যা আছে যা n এর সাথে coprime। coprime অর্থ হল তাদের ১ ছাড়া কোন সাধারণ গুণনীয়ক নেই।
/**Bismillahir Rahmanir Rahim.**/ #include <bits/stdc++.h> using namespace std; int Phi(int n) { int ans = n; for(int i=2; i*i<=n; i++) { if(n%i==0) { while(n%i==0) n/=i; ans -= ans/i; } } if(n>1) ans -= ans/n; return ans; } int main() { int n; scanf("%d", &n); int ans = Phi(n); printf("Number of Coprime for %d is %d\n", n, ans); return 0; }
ল.সা.গু (LCM) (দুই এবং দুইয়ের অধিক সংখ্যার জন্য)
Standardদুইটি সংখ্যার জন্য ল.সা.গুঃ
দুইটির বেশী সংখ্যার জন্য ল.সা.গুঃ
/**Bismillahir Rahmanir Rahim.**/ #include <bits/stdc++.h> using namespace std; int GCD(int a, int b) { if(b==0) return a; return GCD(b, a%b); } int LCM(int a, int b) { int gcd = GCD(a, b); return (a/gcd)*b; } int main() { int a, b, ans; cin >> a >> b; ans = LCM(a,b); cout << ans << endl; return 0; }
দুইটির বেশী সংখ্যার জন্য ল.সা.গুঃ
/**Bismillahir Rahmanir Rahim.**/ #include <bits/stdc++.h> using namespace std; int GCD(int a, int b) { if(b==0) return a; return GCD(b, a%b); } int LCM(int a, int b) { int gcd = GCD(a, b); return (a/gcd)*b; } int main() { int ans, n; cin >> n; int ara[n]; for(int i=0; i<n; i++) cin >> ara[i]; ans = ara[0]; for(int i=1; i<n; i++) ans = LCM(ans, ara[i]); cout << ans << endl; return 0; }
গ.সা.গু (GCD) (দুই এবং দুইয়ের অধিক সংখ্যার জন্য)
Standardদুইটি সংখ্যার জন্য গ.সা.গুঃ
দুইটির বেশী সংখ্যার জন্য গ.সা.গুঃ
/**Bismillahir Rahmanir Rahim.**/ #include <bits/stdc++.h> using namespace std; int GCD(int a, int b) { if(b==0) return a; return GCD(b, a%b); } int main() { int a, b, ans; cin >> a >> b; ans = GCD(a,b); cout << ans << endl; return 0; }
দুইটির বেশী সংখ্যার জন্য গ.সা.গুঃ
/**Bismillahir Rahmanir Rahim.**/ #include <bits/stdc++.h> using namespace std; int GCD(int a, int b) { if(b==0) return a; return GCD(b, a%b); } int main() { int ans, n; cin >> n; int ara[n]; for(int i=0; i<n; i++) cin >> ara[i]; ans = ara[0]; for(int i=1; i<n; i++) ans = GCD(ans, ara[i]); cout << ans << endl; return 0; }
Sum of Divisor (SOD) using 2 Method
Standardএকটি সংখ্যা n দেওয়া আছে। এর বিভাজকের যোগফল বের করতে হবে।
Method 1: রোট পর্যন্ত লোপ চালিয়ে।
Method 1: রোট পর্যন্ত লোপ চালিয়ে।
/**Bismillahir Rahmanir Rahim.**/ #include <bits/stdc++.h> using namespace std; int SOD(int n) { int limit = sqrt(n+1); int res = 0; for(int i=1; i<=limit; i++) if(!(n%i)) { res += i; res += (n/i); } if(limit*limit==n) res -= limit; return res; } int main() { int ans, n; scanf("%d", &n); ans = SOD(n); printf("%d\n", ans); return 0; }Method 2: প্রাইম ফ্যাক্টরাইজড করে।
/**Bismillahir Rahmanir Rahim.**/ #include <bits/stdc++.h> using namespace std; int prime[4009], x=1; void seivePrime() { char prime_b[10000]; memset(prime_b, 0, sizeof(prime_b)); int till = 10000; for(int i=4; i<=till; i+=2) prime_b[i] = 1; int limit = sqrt(till)+1; for(int i=3; i<=limit; i+=2) if(!prime_b[i]) for(int j=i*i; j<=till; j+=(i*2)) prime_b[j] = 1; prime[0] = 2; for(int i=3; i<=till; i+=2) if(!prime_b[i]) prime[x++] = i; } int SOD(int n) { int till = sqrt(n+1), res=1; for(int i=0; prime[i]<=till; i++) { if(n%prime[i]==0) { int tmpSum = 1, p = 1; while(n%prime[i]==0) { n/=prime[i]; p *= prime[i]; tmpSum += p; } till = sqrt(n); res *= tmpSum; } } if(n>1) res *= (n+1); return res; } int main() { seivePrime(); int ans, n; scanf("%d", &n); ans = SOD(n); printf("%d\n", ans); return 0; }
Number of Divisor (NOD) using 2 Method
Standardএকটি সংখ্যা n দেওয়া আছে। এর কয়টি বিভাজক আছে বের করতে হবে।
Method 1: রোট পর্যন্ত লোপ চালিয়ে।
Method 1: রোট পর্যন্ত লোপ চালিয়ে।
/**Bismillahir Rahmanir Rahim.**/ #include <bits/stdc++.h> using namespace std; int NOD(int n) { int limit = sqrt(n+1); int res = 0; for(int i=1; i<=limit; i++) if(!(n%i)) res += 2; if(limit*limit==n) res--; return res; } int main() { int ans, n; scanf("%d", &n); ans = NOD(n); printf("%d\n", ans); return 0; }Method 2: প্রাইম ফ্যাক্টরাইজড করে।
/**Bismillahir Rahmanir Rahim.**/ #include <bits/stdc++.h> using namespace std; int prime[4009], x=1; void seivePrime() { char prime_b[10000]; memset(prime_b, 0, sizeof(prime_b)); int till = 10000; for(int i=4; i<=till; i+=2) prime_b[i] = 1; int limit = sqrt(till)+1; for(int i=3; i<=limit; i+=2) if(!prime_b[i]) for(int j=i*i; j<=till; j+=(i*2)) prime_b[j] = 1; prime[0] = 2; for(int i=3; i<=till; i+=2) if(!prime_b[i]) prime[x++] = i; } int NOD(int n) { int till = sqrt(n+1); int p=0, res = 1; for(int i=0; prime[i]<=till; i++) { if(n%prime[i]==0) { while(n%prime[i]==0) { n/=prime[i]; p++; } } till = sqrt(n); res *= (p+1); p = 0; } if(n>1) res *= 2; return res; } int main() { seivePrime(); int ans, n; scanf("%d", &n); ans = NOD(n); printf("%d\n", ans); return 0; }
মৌলিক উৎপাদকে বিশ্লেষণ (Prime Factorization)
Standardএকটি সংখ্যা n দেওয়া আছে। এটিকে মৌলিক উৎপাদকে বিশ্লেষণ করতে হবে।
/**Bismillahir Rahmanir Rahim.**/ #include <bits/stdc++.h> using namespace std; int ara[1000], x; int primeFact(int n) { while(n%2==0) { n/=2; ara[x++] = 2; } int limit = sqrt(n+1); for(int i=3; i<=limit && n>1; i+=2) while(n%i==0) { n/=i; ara[x++] = i; } if(n>2) ara[x++] = n; return x; } int main() { int n=10000, till; till = primeFact(n); for(int i=0; i<till; i++) printf("%d ", ara[i]); return 0; }
সেগমেন্টেড সীভ (Segmented Sieve)
Standardদুইটি সংখ্যা A আর B দেওয়া আছে (A<B)। A থেকে B পর্যন্ত প্রাইম নাম্বার গুলো প্রিন্ট করতে হবে। A = 100, B = 1000 এর জন্য নিচের কোড করা হল।
/**Bismillahir Rahmanir Rahim.**/ #include <bits/stdc++.h> using namespace std; int prime[100], x, final_prime[100], y; void seivePrime(char prime_b[], int b) { prime_b[1]=1; int till = sqrt(b+1); for(int i=4; i<=till; i+=2) prime_b[i] = 1; int limit = sqrt(till)+1; for(int i=3; i<=limit; i+=2) { if(!prime_b[i]) { for(int j=i*i; j<=till; j+=(i*2)) prime_b[j] = 1; } } prime[0] = 2; for(int i=3; i<=till; i+=2) if(!prime_b[i]) prime[++x] = i; } void segment_prime(int A, int B) { if(A==1) A+=1; char segment[B-A+1]; memset(segment, 0, sizeof(segment)); for(int i=0; i<x; i++) { int start = prime[i]*prime[i]; if(start<A) start = ((A+prime[i]-1)/prime[i])*prime[i]; for(; start<=B; start += prime[i]) segment[start-A] = 1; } if(A == 2) final_prime[y++] = 2; int j=A+1; if(A%2) j=A; for(; j<=B; j+=2) if(!segment[j-A]) final_prime[y++] = j; } int main() { int a = 100, b = 1000; char prime_b[123]; memset(prime_b, 0, sizeof(prime_b)); seivePrime(prime_b, b); segment_prime(a, b); for(int i=0; i<y; i++) printf("%d ", final_prime[i]); return 0; }
সীভ মেথডে প্রাইম বের করা (Calculation Prime Number Using Sieve)
Standard1 থেকে n পর্যন্ত সব প্রাইম নাম্বার বের করতে হবে সীভ মেথডে। নিচের প্রোগ্রামে ১০০০ পর্যন্ত বের করা হল।
Complexity : O(n log log n).
Complexity : O(n log log n).
/**Bismillahir Rahmanir Rahim.**/ #include <bits/stdc++.h> using namespace std; void seivePrime(char seive[]) { seive[1]=1; int till=1000; for(int i=4; i<=till; i+=2) seive[i] = 1; int limit = sqrt(till)+1; for(int i=3; i<=limit; i+=2) { if(!seive[i]) for(int j=i*i; j<=till; j+=(i*2)) seive[j] = 1; } } int main() { char seive[1005]; memset(seive, 0, sizeof(seive)); seivePrime(seive); for(int i=2; i<=1000; i++) if(!seive[i]) printf("%d ", i); return 0; }
Subscribe to:
Posts (Atom)