- 1
- 2
bool isOk(long j ,int i)
{
if(i <= 1)
{
if(i == 0)
return true;
else if(j == 0 || j == 2)
return true;
return false;
}
else
{
if((long)pow(3,i-1) < j && j < (long)2*pow(3,i-1) )
return false;
else
if((long)pow(3,i-1) <= j )
return isOk((long)pow(3,i)-j-1, i-1 );
else
return isOk( j , i-1 );
}
}
int main() { int i; long j; while(cin>>i>>j) {
if(i == 0 && j == 0 )
break;
if(i< 0 || j < 0 )
{cout<<"No"<<endl;continue;}
if(j >= pow(3,i) || j == 0)
{cout<<"Yes"<<endl;continue;}
if(!isOk(j-1,i))
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
} return 0; }
nabayad int begiri az bazeye int khareje !!
Use long long
instead of int
.
P.S. Please post your code in code format. You just have to put a tab or 4 spaces before each line. Please read the markdown editor help on the top of the editor. You can also read it's wikipedia page.
AMiR said:
Use
long long
instead ofint
.P.S. Please post your code in code format. You just have to put a tab or 4 spaces before each line. Please read the markdown editor help on the top of the editor. You can also read it's [wikipedia page][1].
i == tavan j == adad va tavan < 30 banabar in nabayad moshkeli ijad beshe ba in gereftanesh va hamchenin ke man taghiresh dadam bazam wrong khordam!
The output specification mentioned:
Each test case is given in a line containing two numbers k (less than 30) and i (at most 3^k)
According to this, i can be 3^30 which is too large to fit in integer type. You should use long long
(in your variable definition and type castings).
Your solution may have some other problems. I would suggest you to post your newest code here again.
i in problem is j in my code!
AMiR said:
The output specification mentioned:
Each test case is given in a line containing two numbers k (less than 30) and i (at most 3^k)
According to this, i can be 3^30 which is too large to fit in integer type. You should use
long long
(in your variable definition and type castings).Your solution may have some other problems. I would suggest you to post your newest code here again.
bool isOk(long j ,long long i)
{
if(i <= 1)
{
if(i == 0)
return true;
else if(j == 0 || j == 2)
return true;
return false;
}
else
{
if((long)pow(3,i-1) < j && j < (long)2*pow(3,i-1) )
return false;
else
if((long)pow(3,i-1) <= j )
return isOk((long)pow(3,i)-j-1, i-1 );
else
return isOk( j , i-1 );
}
}
int main()
{
long i;
long j;
while(cin>>i>>j)
{
if(i == 0 && j == 0 )
break;
if(i< 0 || j < 0 )
{cout<<"No"<<endl;continue;}
if(j >= pow(3,i) || j == 0)
{cout<<"Yes"<<endl;continue;}
if(!isOk(j-1,i))
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
}
return 0;
}
You can't use int
to save large values!
As you may know, long
and int
are the same and both using 32 bits to store values. Use long long
for every variable! You also should cast the pow
function's return value to long long
.
Another problem is pow
returns in double
which is not accurate enough for large values. I would suggest that write your own power function that uses long long
to calculate powers of 3, or use powl
function that returns in long double
which is more accurate.
The seccond approuch can be implemented by adding this: #define pow powl
.
P.S. This problem can be solved simpler. Think about it. :)
thank you my program accepted.
AMiR said:
You can't use
int
to save large values!As you may know,
long
andint
are the same and both using 32 bits to store values. Uselong long
for every variable! You also should cast thepow
function's return value tolong long
.Another problem is
pow
returns indouble
which is not accurate enough for large values. I would suggest that write your own power function that useslong long
to calculate powers of 3, or usepowl
function that returns inlong double
which is more accurate.The seccond approuch can be implemented by adding this:
#define pow powl
.P.S. This problem can be solved simpler. Think about it. :)
for me, it shows runtime error, i can't use Long long in java, is there equal type for it? my code:
import java.util.Scanner;
public class Main {
private static Integer k, index;
private static String line;
private static String[] lineArray = new String[2];
private static Scanner input = new Scanner(System.in);
private static Integer powerK;
private static Integer plus, first, last, length;
private static String[] myArray;
public static void main(String[] args) {
line = input.nextLine();
lineArray = line.split(" ");
k = Integer.parseInt(lineArray[0]);
index = Integer.parseInt(lineArray[1]);
while (!line.equals("0 0")) {
powerK = 1;
for (int j = 0; j < k; j++) {
powerK = powerK * 3;
}
myArray = new String[powerK];
for (int p = 0; p < powerK; p++) {
myArray[p] = "-";
}
act(powerK, 0, powerK - 1);
//making input ready for process
if (myArray[index-1].equals("-")) {
System.out.print("Yes");
} else {
System.out.print("No");
}
System.out.print("\n");
line = input.nextLine();
lineArray = line.split(" ");
k = Integer.parseInt(lineArray[0]);
index = Integer.parseInt(lineArray[1]);
}
}
static void act(int powerKK, int first, int last) {
if (powerKK != 1) {
act(powerKK / 3, first, (powerKK) / 3 + first - 1);
act(powerKK / 3, first + (2 * powerKK / 3), last);
clean((powerKK / 3) + first, first + (2 * powerKK / 3) - 1);
}
}
static void clean(int first, int last) {
for (int t = first; t <= last; t++) {
myArray[t] = " ";
}
}
}
In order to post something you must login first. You can use the form in the top of this page.