Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

是个水题,二分一下就可以了

Posted by KatrineYang at 2016-09-09 05:20:27 on Problem 1289
掉了一个continue导致X-Y==1時输出两次答案嚷昂一次也是醉了
还有坑爹的C标准,log(int)再次CE。。。跪了
#include <iostream>
#include <stdio.h>
#include <cmath>
using namespace std;

int main() {
	while(1){
		long long int X, Y;
		scanf("%I64d%I64d", &X, &Y);
		if(X==0 && Y==0) return 0;
		if(X==1){
			cout << "0 1\n";
			continue;
		}
		else if(Y==1){
			long long int N = 1;
			long long int K = (long long int)(log(X+0.0)/log(2.0)+1e-11);
			printf("%I64d %I64d\n", K, 2*X-1);
			continue;
		}
		else if(X-Y==1){
			long long int K = 1;
			long long int N = Y;
			printf("1 %I64d\n", 2*N+1);
			continue;
		}
		long long int minK = 1;
		while(pow(X+0.0, 1.0/minK)-pow(Y+0.0, 1.0/minK) > 1){
			minK *= 2;
		}
		long long int low = minK/2, up = minK, ans = -1;
		while(low < up){
			long long int mid = (low + up)/2;
			double t = pow(X+0.0, 1.0/mid)-pow(Y+0.0, 1.0/mid);
			if(abs(t-1.0) < 1e-10){
				ans = mid;
				break;
			}
			if(t > 1.0){
				low = mid+1;
			}
			else{
				up = mid-1;
			}
		}
		if(ans == -1) ans = up;
		long long int K = ans;
		long long int N = (long long int)(pow(Y+0.0, 1.0/K)+1e-10);
		long long int ans1 = 0, ans2 = 0;
		long long int p = 1;
		for(long long int k = 0; k < K; k++){
			ans1 += p;
			p *= N;
		}
		ans2 += p;
		for(long long int k = 0; k < K; k++){
			p /= N;
			p *= (N+1);
			ans2 += p;
		}
		printf("%I64d %I64d\n", ans1, ans2);
	}
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator