http://codeforces.com/problemset/problem/598/A
খুবই মজার একটা সমস্যা । । তোমায় একটা সংখ্যা দেয়া থাকবে , তোমায় ১ থেকে সেই অবদি সংখ্যাগুলির যোগফল বের করতে হবে , বাট একটু ঝামেলা আছে এই যে - যে সংখ্যাগুলি , ২ এর উপরে পাওয়ার দিয়ে প্রকাশ করা সম্ভব হয় , সেইগুলো'র আগে মাইনাস চিহ্ন থাকবে , যেমন ১, ২, ৪, ৮......ইত্যাদি । । তাহলে ধরো , তোমায় বলা হলো , N=5 | |
তাইলে , ধারাটি কেমন হবে ?? - 1 - 2 + 3 - এখন 4 + 5,এটা চাইলেই লুপ খাটিয়ে করা যায় , কিন্তু । আমরা একটু সহজ / শরটকারট পদ্ধতি পাই কি না ?? ধরো ধারাটি যদি এমন হতো সবগুলো প্লাস তাহলে , +1 + 2 +3 + 4 + 5 = 15
- 1 - 2 + 3 - 4 + 5 = 1
এখন এখানে , প্রথম'টার যোগফল সেকেন্ড'টার চেয়ে ১৪ বেশী । এই ১৪ টা বেশী হলো , কোথায় ??? চলো - খতিয়ে দেখি । -1 > +1 , 2 বেশী
-2 > +2 , 4 বেশী
-4 > +4 ,8 বেশী
-------------------------------
১৪ বেশী
তাহলে , আমরা - যদি , N=5 এর জন্য , যোগফল বের করি , ( n*(n+1) ) /2 = ১৫ , তারপর যেহেতু , ২ সবসময় বেশী থাকবেই , তাই - সেটা আগে বিয়োগ করে নিবো , তারপর একটা লুপ খাটিয়ে ৪ ও ৮ বিয়োগ করবো । । আমাদের উত্তর'টা পেয়ে যাবো , তাহলেই আমাদের সময় খুবই কম লাগবে । চলো , কোড দেখি ফেলি একবার , একটু চিন্তা করলেই সবকিছু পানির মতো ক্লিয়ার হয়ে যাবে , তাই চিন্তা করতে শেখো ---
IN C++ LANGUAGE.........................................
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
__int64 n,i;
cin>>n;
__int64 ans=((n+1)*n)/2-2;
for( int i=1;pow(2,i)<=n;i++)
{
ans = ans - pow(2,i+1);
}
cout<<ans<<endl;
}
return 0;
}
IN C# LANGUAGE...................................
using System;
class Exercise11
{
static void Main()
{
int t=Convert.ToInt32(Console.ReadLine());
for(int j=0;j<t;j++)
{
long n=Convert.ToInt64(Console.ReadLine());
long ans=((n+1)*n)/2-2;
for( int i=1;(long)Math.Pow(2,i)<=n;i++)
{
ans = ans -(long) Math.Pow(2,i+1);
}
Console.WriteLine(ans);
}
}
}
খুবই মজার একটা সমস্যা । । তোমায় একটা সংখ্যা দেয়া থাকবে , তোমায় ১ থেকে সেই অবদি সংখ্যাগুলির যোগফল বের করতে হবে , বাট একটু ঝামেলা আছে এই যে - যে সংখ্যাগুলি , ২ এর উপরে পাওয়ার দিয়ে প্রকাশ করা সম্ভব হয় , সেইগুলো'র আগে মাইনাস চিহ্ন থাকবে , যেমন ১, ২, ৪, ৮......ইত্যাদি । । তাহলে ধরো , তোমায় বলা হলো , N=5 | |
তাইলে , ধারাটি কেমন হবে ?? - 1 - 2 + 3 - এখন 4 + 5,এটা চাইলেই লুপ খাটিয়ে করা যায় , কিন্তু । আমরা একটু সহজ / শরটকারট পদ্ধতি পাই কি না ?? ধরো ধারাটি যদি এমন হতো সবগুলো প্লাস তাহলে , +1 + 2 +3 + 4 + 5 = 15
- 1 - 2 + 3 - 4 + 5 = 1
এখন এখানে , প্রথম'টার যোগফল সেকেন্ড'টার চেয়ে ১৪ বেশী । এই ১৪ টা বেশী হলো , কোথায় ??? চলো - খতিয়ে দেখি । -1 > +1 , 2 বেশী
-2 > +2 , 4 বেশী
-4 > +4 ,8 বেশী
-------------------------------
১৪ বেশী
তাহলে , আমরা - যদি , N=5 এর জন্য , যোগফল বের করি , ( n*(n+1) ) /2 = ১৫ , তারপর যেহেতু , ২ সবসময় বেশী থাকবেই , তাই - সেটা আগে বিয়োগ করে নিবো , তারপর একটা লুপ খাটিয়ে ৪ ও ৮ বিয়োগ করবো । । আমাদের উত্তর'টা পেয়ে যাবো , তাহলেই আমাদের সময় খুবই কম লাগবে । চলো , কোড দেখি ফেলি একবার , একটু চিন্তা করলেই সবকিছু পানির মতো ক্লিয়ার হয়ে যাবে , তাই চিন্তা করতে শেখো ---
IN C++ LANGUAGE.........................................
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
__int64 n,i;
cin>>n;
__int64 ans=((n+1)*n)/2-2;
for( int i=1;pow(2,i)<=n;i++)
{
ans = ans - pow(2,i+1);
}
cout<<ans<<endl;
}
return 0;
}
IN C# LANGUAGE...................................
using System;
class Exercise11
{
static void Main()
{
int t=Convert.ToInt32(Console.ReadLine());
for(int j=0;j<t;j++)
{
long n=Convert.ToInt64(Console.ReadLine());
long ans=((n+1)*n)/2-2;
for( int i=1;(long)Math.Pow(2,i)<=n;i++)
{
ans = ans -(long) Math.Pow(2,i+1);
}
Console.WriteLine(ans);
}
}
}
No comments:
Post a Comment