here is only basic implementation of problems for beginners. If you have any problem with any solution or any basic concept of programming or you want more efficient solution you can mail me.
my suggestion is not to copy and paste codes from here try to understand the logic and think why you were not able to solve it.
Wednesday, 29 October 2014
A Summatory
problem statement is here
#include <stdio.h>
#define M 1000010
int t,c;
long long int sum[M];
int main(){
long long int i, a = 0;
for (i = 1; i < M; i++){
a = (a + i*i*i) % 1000000003;
sum[i] = (sum[i-1] + a) % 1000000003;
}
scanf("%d", &t);
while (t--){
scanf("%d", &c);
printf("%lld\n", sum[c]);
}
return 0;
}
Saturday, 25 October 2014
GETTING AN AP
problem statement is here
#include<stdio.h>
long long gcd(long long m,long long n){
if(n==0)
return m;
else
return gcd(n,m%n);
}
long long calcu(long long a,long long n){
long long u,c,d;
u=0;
if(n%2==0){
c=(a-n)/2;
c--;
d=(a-1)/2;
u=(d*(d+1))/2;
u=u-(c*(c+1))/2;
u*=2;
}else{
c=(a-n)/2;
c--;
d=(a-2)/2;
u=(d*(d+1))/2;
u=u-(c*(c+1))/2;
u*=2;
u+=((a-1)/2);
}
u+=n;
return u;
}
int main(){
long long a,b,n,p,t;
scanf("%lld",&t);
while(t--){
scanf("%lld",&n);
a=calcu(3*n,n)+calcu(n,n-2);
a-=(n-2);
p=n*2*n*3*n;
b=gcd(a,p);
a/=b;
p/=b;
printf("%lld/%lld\n",a,p);
}
return 0;
}
Large subsequence Problem
problem statement is here
#include<stdio.h>
#include<string.h>
#define mod 1000000007
int main(){
int c=1,i,n,t,u,v,s;
char ar[10011];
scanf("%d",&t);
while(t--){
s=0;
int br[11]={0};
scanf("%s",ar);
n=strlen(ar);
for(i=0;i<n;i++){
v=u=ar[i]-48;
while(v--){
br[u]=(br[u]+br[v])%mod;
}
br[u]++;
}
for(i=0;i<=9;i++){
s=(s+br[i])%mod;
}
printf("Case %d: %d\n",c,s);
c++;
}
return 0;
}
Thursday, 23 October 2014
Distracted judges
problem statement is here
#include<stdio.h>
int main(){
long a,b,c,d,i,j,t,n;
scanf("%ld",&t);
long ar[100005],br[100005],cr[100005]={0};
for(i=0;i<t;i++){
scanf("%ld",&ar[i]);
}
j=0;
br[j]=t;
j++;
a=1;
for(i=t-2;i>=0;i--){
if(ar[i]==a){
br[j++]=i;
cr[i]=1;
}else if(cr[i+ar[i]+1]==1){
br[j++]=i;
cr[i]++;
}
a++;
}
for(i=j-1;i>=0;i--){
if(br[i]!=0)
printf("%ld\n",br[i]);
}
return 0;
}
Gallantry
problem statement is here
#include<stdio.h>
#include<algorithm>
using namespace std;
int main(){
int a,b,c,d,ar[10004],br[10000],n,i,j,t;
scanf("%d",&t);
for(i=0;i<t;i++){
scanf("%d",&ar[i]);
}
sort(ar,ar+t);
b=0;c=0;
for(i=0;i<t;i+=2){
br[b]=ar[i+1]-ar[i];
c+=br[b];
b++;
}
if(c==0){
printf("-1\n");
}else{
a=t/2;d=0;n=0;
sort(br,br+a);
for(i=0;i<a;i++){
if(c-br[i]>n+br[i]){
c-=br[i];
d++;
n+=br[i];
}else{
break;
}
}
printf("%d\n",d);
}
return 0;
}
Wednesday, 22 October 2014
Breadth first traversal for undirected graph
here we are assuming that all the nodes are connected
#include<stdio.h>
#include<vector>
#include<queue>
using namespace std;
void bfs(vector<int> ar[],int visited[],int i,int n){
int j;
queue<int> que;
visited[i]=1;
que.push(i);
while(que.size()>0){
i=que.front();
que.pop();
printf("%d\n",i);
for(j=0;j<ar[i].size();j++){
if(visited[ar[i][j]]==0){
que.push(ar[i][j]);
visited[ar[i][j]]=1;
}
}
}
}
int main(){
int a,b,i,j,n,m;
printf("no of nodes\n");
scanf("%d",&n);
vector<int> ar[n+9];
int visited[n+9];
for(i=0;i<n+9;i++){
visited[i]=0;
}
printf("no of edges\n");
scanf("%d",&m);
printf("Enter edges\n");
for(j=0;j<m;j++){
scanf("%d %d",&a,&b);
ar[a].push_back(b);
ar[b].push_back(a);
}
printf("from which node to traverse\n");
scanf("%d",&i);
bfs(ar,visited,i,n);
return 0;
}
#include<stdio.h>
#include<vector>
#include<queue>
using namespace std;
void bfs(vector<int> ar[],int visited[],int i,int n){
int j;
queue<int> que;
visited[i]=1;
que.push(i);
while(que.size()>0){
i=que.front();
que.pop();
printf("%d\n",i);
for(j=0;j<ar[i].size();j++){
if(visited[ar[i][j]]==0){
que.push(ar[i][j]);
visited[ar[i][j]]=1;
}
}
}
}
int main(){
int a,b,i,j,n,m;
printf("no of nodes\n");
scanf("%d",&n);
vector<int> ar[n+9];
int visited[n+9];
for(i=0;i<n+9;i++){
visited[i]=0;
}
printf("no of edges\n");
scanf("%d",&m);
printf("Enter edges\n");
for(j=0;j<m;j++){
scanf("%d %d",&a,&b);
ar[a].push_back(b);
ar[b].push_back(a);
}
printf("from which node to traverse\n");
scanf("%d",&i);
bfs(ar,visited,i,n);
return 0;
}
Monday, 20 October 2014
Crucial Equation
problem statement is here
#include<stdio.h>
gcd(int m,int n){
if(n==0)
return m;
else
return gcd(n,m%n);
}
int main(){
int a,b,c,t,g,e=1;
scanf("%d",&t);
while(t--){
scanf("%d %d %d",&a,&b,&c);
g=gcd(abs(a),abs(b));
if(c%g==0)
printf("Case %d: Yes\n",e);
else
printf("Case %d: No\n",e);
e++;
}
return 0;
}
Pigeonhole Tower
problem statement is here
#include<stdio.h>
#include<math.h>
int main() {
long long a,b,c=1,d,i,j,t,n;
scanf("%lld",&t);
while(t--){
scanf("%lld",&n);
if(n<3){
a=0;
}else{
b=sqrt(n);
while(1){
if(b*(b+2)<=n){
a=b;
break;
}else{
b--;
}
}
}
printf("Case %lld: %lld\n",c,a);
c++;
}
return 0;
}
Monday, 13 October 2014
spoj dota heroes
problem statement is here
#include<stdio.h>
int main(){
int a,i,j,k,h[100000],d,t,n,l;
scanf("%d",&a);
for(i=0;i<a;i++){
scanf("%d %d %d",&n,&t,&d);
for(j=0;j<n;j++){
scanf("%d",&h[j]);
}
l=0;
for(k=0;k<t;k++){
for(j=0;j<n;j++){
if(h[j]>d){
h[j]=h[j]-d;
l=l+1;
break;
}
}
}
if(l==t)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
#include<stdio.h>
int main(){
int a,i,j,k,h[100000],d,t,n,l;
scanf("%d",&a);
for(i=0;i<a;i++){
scanf("%d %d %d",&n,&t,&d);
for(j=0;j<n;j++){
scanf("%d",&h[j]);
}
l=0;
for(k=0;k<t;k++){
for(j=0;j<n;j++){
if(h[j]>d){
h[j]=h[j]-d;
l=l+1;
break;
}
}
}
if(l==t)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
Monday, 6 October 2014
Boring factorials
problem is here
This can be solved using Wilson theorem
(1). if n>=p ans would be 0
(2). then we have to use Wilson's theorem
(p-1)! ≡ -1 (mod p)
1*2*3*.........*(n-1)*(n)*..............*(p-1) ≡ -1 (mod p)
n!*(n+1)*...........*(p-1) ≡ -1 (mod p)
n! ≡ -1*[(n+1)*...............(p-2)*(p-1)]^-1 (mod p)
#include<stdio.h>
long long power(long long a,long long b,long long m){
long long x=1,y=a;
while(b>0){
if(b%2!=0){
x=(x*y)%m;
}
y=(y*y)%m;
b>>=1;
}
return x;
}
int main(){
int t;
long long n,p,i,result,z,x;
scanf("%d",&t);
while(t--){
result=-1;
scanf("%lld %lld",&n,&p);
if(n>=p){
printf("0\n");
continue;
}
x=1;
for(i=n+1;i<p;i++){
x=(x*i)%p;
}
z=power(x,p-2,p);
result=(result*z)%p;
printf("%lld\n",p+result);
}
return 0;
}
Saturday, 4 October 2014
Interesting Selection
problem statement is here
here we have two possibilities
(1). we take cold drink from 1st position
(2). we take poison from 1st position
rest can be easily calculated using dp
#include<stdio.h>
long long ar[100006],br[100007];
long long max(long long a,long long b){
if(a>b){
return a;
}else{
return b;
}
}
long long check(long long a,long long b){
if(a>b){
return 0;
}
long long cr[b+1],i;
cr[a]=ar[a];
cr[a-1]=0;
for(i=a+1;i<=b;i++){
cr[i]=max((cr[i-2]+ar[i]-br[i-1]),cr[i-1]-br[i]);
}
return cr[b];
}
int main(){
long long a,b,c,i,j,n,x,y,z;
int t;
scanf("%d",&t);
while(t--){
scanf("%lld",&n);
for(i=0;i<n;i++){
scanf("%lld",&ar[i]);
}
for(i=0;i<n;i++){
scanf("%lld",&br[i]);
}
if(n==1){
x=ar[0];
}else if(n==2){
x=max(ar[0]-br[1],ar[1]-br[0]);
}else{
y=ar[0]-br[n-1]-br[1]+check(2,n-2);
z=check(1,n-1)-br[0];
x=max(y,z);
}
printf("%lld\n",x);
}
return 0;
}
Sum
#include<stdio.h>
int main(){
long a,b,n,i,j,ar[1002],u,m;
scanf("%ld",&n);
for(i=0;i<n;i++){
scanf("%ld",&ar[i]);
}
for(i=1;i<n;i++){
for(j=0;j<n;j++){
scanf("%ld",&u);
if(i==1 && j==2){
m=u;
}
}
}
if(n==2){
printf("1 %ld\n",ar[1]-1);
}else{
a=(ar[1]+ar[2]-m)/2;
printf("%ld",a);
for(i=1;i<n;i++){
b=ar[i]-a;
printf(" %ld",b);
}
printf("\n");
}
return 0;
}
Friday, 3 October 2014
Interesting Numbers
problem statement is here
#include<stdio.h>
#include<algorithm>
#include<limits>
using namespace std;
int main(){
long long a=0,b,c,y,n,i,j,d,e,min;
scanf("%lld",&n);
long long ar[n+1];
for(i=0;i<n;i++){
scanf("%lld",&ar[i]);
}
sort(ar,ar+n);
a=ar[0];d=1;
for(i=1;i<n;i++){
if(ar[i]==a){
d++;
}else{
break;
}
}
a=ar[n-1];e=1;
for(i=n-2;i>=0;i--){
if(ar[i]==a){
e++;
}else{
break;
}
}
if(n==d){
b=(n*(n-1))/2;
}else{
b=d*e;
}
min=LLONG_MAX;
for(i=0;i<n-1;i++){
if(ar[i+1]-ar[i]<min){
min=ar[i+1]-ar[i];
}
}
// printf("%lld\n",min);
if(min==0){
c=0;
a=ar[0];d=1;
for(i=1;i<n;i++){
if(ar[i]==a){
d++;
}else{
c+=((d*(d-1))/2);
d=1;
a=ar[i];
}
}
c+=((d*(d-1))/2);
}else{
c=0;
for(i=1;i<n;i++){
if(ar[i]-ar[i-1]==min){
c++;
}
}
}
printf("%lld %lld",c,b);
return 0;
}
Friends of Friends
problem statement is here
#include<stdio.h>
int main(){
int a,i,j,n,m[200],ar[10009]={0},ans=0,b;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d %d",&m[i],&a);
for(j=0;j<a;j++){
scanf("%d",&b);
ar[b]=1;
}
}
for(i=0;i<n;i++){
ar[m[i]]=0;
}
for(i=0;i<10000;i++){
if(ar[i]==1){
ans++;
}
}
printf("%d\n",ans);
return 0;
}
Thursday, 2 October 2014
Minimum spanning tree kruskal algorithm
Time complexity O(eLoge + eLogv)
steps:-
sort all the edges according to their weights
pick minimum weighted edge and check for cycle
if(makes cycle) -> discard that edge
else -> take it
repeat it until we get v-1 nodes
no of edges in final tree = v-1
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int e,v;
struct nodes{
int a;
int b;
int w;
};
struct checker{
int parent;
int rank;
};
bool compare (nodes p1, nodes p2){
return (p1.w > p2.w);
}
int find( struct checker br[], int i){
if (br[i].parent != i){
br[i].parent = find(br, br[i].parent);
}
return br[i].parent;
}
void Union(struct checker br[],int x,int y){
int xroot = find(br, x);
int yroot = find(br, y);
if (br[xroot].rank < br[yroot].rank){
br[xroot].parent = yroot;
}else if (br[xroot].rank > br[yroot].rank){
br[yroot].parent = xroot;
}else{
br[yroot].parent = xroot;
br[xroot].rank++;
}
}
int kruskal(vector<nodes>& ar){
int weight=0;
struct checker br[1000];
int i;
sort(ar.begin(),ar.end(),compare);
for(i=0;i<v;i++){
br[i].parent=i;
br[i].rank=0;
}
int z=0;
for(i=e-1;i>=0;i--){
int x=find(br,ar[i].a);
int y=find(br,ar[i].b);
if(x!=y){
Union(br,ar[i].a,ar[i].b);
weight+=ar[i].w;
z++;
}
if(z==v-1){
break;
}
}
return weight;
}
int main(){
int c,d,r,i,j,n,m;
vector<nodes> ar(1000);
printf("Enter no of vertexes and edges\n");
scanf("%d %d",&v,&e);
printf("Edges\n");
for(i=0;i<e;i++){
scanf("%d %d %d",&ar[i].a,&ar[i].b,&ar[i].w);
}
c=kruskal(ar);
printf("%d\n",c);
return 0;
}
steps:-
sort all the edges according to their weights
pick minimum weighted edge and check for cycle
if(makes cycle) -> discard that edge
else -> take it
repeat it until we get v-1 nodes
no of edges in final tree = v-1
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int e,v;
struct nodes{
int a;
int b;
int w;
};
struct checker{
int parent;
int rank;
};
bool compare (nodes p1, nodes p2){
return (p1.w > p2.w);
}
int find( struct checker br[], int i){
if (br[i].parent != i){
br[i].parent = find(br, br[i].parent);
}
return br[i].parent;
}
void Union(struct checker br[],int x,int y){
int xroot = find(br, x);
int yroot = find(br, y);
if (br[xroot].rank < br[yroot].rank){
br[xroot].parent = yroot;
}else if (br[xroot].rank > br[yroot].rank){
br[yroot].parent = xroot;
}else{
br[yroot].parent = xroot;
br[xroot].rank++;
}
}
int kruskal(vector<nodes>& ar){
int weight=0;
struct checker br[1000];
int i;
sort(ar.begin(),ar.end(),compare);
for(i=0;i<v;i++){
br[i].parent=i;
br[i].rank=0;
}
int z=0;
for(i=e-1;i>=0;i--){
int x=find(br,ar[i].a);
int y=find(br,ar[i].b);
if(x!=y){
Union(br,ar[i].a,ar[i].b);
weight+=ar[i].w;
z++;
}
if(z==v-1){
break;
}
}
return weight;
}
int main(){
int c,d,r,i,j,n,m;
vector<nodes> ar(1000);
printf("Enter no of vertexes and edges\n");
scanf("%d %d",&v,&e);
printf("Edges\n");
for(i=0;i<e;i++){
scanf("%d %d %d",&ar[i].a,&ar[i].b,&ar[i].w);
}
c=kruskal(ar);
printf("%d\n",c);
return 0;
}
Subscribe to:
Posts (Atom)