HDU - 6288 / 科学计算器的用法算log /真nm详细-.-

其实就是个二分,使用抽特王无敌模板可以解决……可以解决……样例……

……但是越到后面就会发现有矛盾,因为会溢出

虽然你给了10,10,10000。。。。的时候结果还算合理,但是这个天衣无缝的二分怎么可能会错呢?一般的思路就是读题和看边界了,这个题边界这么大,保不齐还真的就是有问题!!!!

你觉得你直接给了K会溢出啊 1e18你直接乘 还10次方 上去就爆了

检查不出来的时候从小数据往上找 然后你就会发现竟然有问题。。(经验!!!)

【二分。。。是在区间范围里面找,如果溢出了,那只能给边界咯。它是在包括边界的范围里呀……溢出了的话二分也没办法给出答案!!】

还有一点就是 1 1 1e18 的时候取到的是1e18 你觉得边界已经够大了吧

再给10 10 的时候  后面又溢出了

……心态炸了呀兄弟 这怎么取上界呀

答案就是……不用取 直接除 除完k和。。之后可以的话就可以

(代码还没写  等我A掉吧)

==这个代码是用了外挂的。。。试过了 不用int128会挂掉。

int/unsigned int 占16位,long/unsigned long占32位

int128就是128位数咯...呵呵呵呵  wa到现在 真的是

#include <bits/stdc++.h>  
using namespace std;  
int a,b;  
#define ll long long  
using it = __int128;  
unsigned long long k;  
int L(ll n)  
{  
    return ceil(log2(n));  
}  
int check(it x)  
{  
    it ans = 1;  
    for(int i = 0 ; i < a ; i++)  
    {  
        ans = ans * x;  
        if(ans > k )return 0;  
    }  
    it te = L(x);  
    for(int i = 0 ; i < b ; i++)  
    {  
        ans *= te;  
        if(ans > k) return 0;  
    }  
    return 1;  
}  
int main()  
{  
    int t;  
    scanf("%d",&t);  
    while(t--)  
    {  
        scanf("%d%d%llu",&a,&b,&k);  
        ll  l = 0 , r = 1e18;  
        ll ans = 0;  
        while(l<r)  
        {  
            unsigned long long m = l+(r-l)/2;  
            if(check(m))  
            {  
                l = m+1;  
                ans = m;  
             }  
            else r = m;  
        }  
        printf("%lld\n",ans);  
    }  
}  

===好的  直播进程  我的代码后面的都没问题 就二分里面那里

check里面换了A掉的:

#include<iostream>
#include<math.h>
#include<algorithm>
using namespace std;

typedef  unsigned long long ll;
ll a, b, k;
/*
bool check(ll x) {
	if (x== 1)return true;
	long double tempk = k;
	ll templog = ceil(log2(x));// ceil(log(n) / log(2));
	
	bool flag = true;
	for (int i = 1; i <= a; i++) {
		tempk = tempk / (long double )n;
		if (tempk < 1.0) 	return false; 
	}
	for (int i = 1; i <= b; i++) {
		tempk = tempk / (long double )templog;
		if (tempk < 1.0) return false; 	
	}
	return true;
}*/
ll s[100] = { 1 };
int check(ll n)
{
	int j = 0;
	for (j = 0; j <= 62; j++)
		if (n <= s[j])break;
	long double t = k;
	for (int i = 0; i<b; i++)
	{
		t = t / (long double)j;
		if (t<1.0)return 0;
	}
	for (int i = 0; i<a; i++)
	{
		t = t / (long double)n;
		if (t<1.0)return 0;
	}
	return 1;
}

int main() {
	long long t;
	cin >> t;
	while (t--) {
		cin >> a >> b >> k;
		long long  l = 0;
		long long  r = k;
		for (int i = 1; i <= 62; i++)
		{
			s[i] = ll(1ll << i);
		}
		ll  ans = 0;
		while (l <= r) {
			ll mid = (l + r) / 2;
			if (check(mid) == true) {
				l = mid + 1;
				ans = mid;
			}
			else
				r = mid - 1;
		}
		cout << ans<< endl;
	}
	return 0;

}

接下来就是激动人心的时刻了

===?????我真的A了

问题出在哪里呢 竟然就在我最后那个狗屁log用法上面 

....

改了就过了

.....所以后面那些还是不要看了吧  验算用就可以了 直接log2(x)=.=...除会有精度损失的

......我真的是  ????

真的。手测了一下好像还没什么差别,但是以前WA的改了一小点就过了。

……


#include<iostream>
#include<math.h>
#include<algorithm>
using namespace std;

typedef  unsigned long long ll;
ll a, b, k;
ll s[100] = { 1 };
int check(ll n)
{
	if (n == 1)return true;
	long double tempk = k;
	ll templog = ceil(log2(n));// ceil(log(n) / log(2));
	long double t = k;
	
	for (int i = 1; i <= a; i++) {
		tempk = tempk / (long double)n;
		if (tempk < 1.0) 	return false;
	}
	for (int i = 1; i <= b; i++) {
		tempk = tempk / (long double)templog;
		if (tempk < 1.0) return false;
	}
	return true;
}

int main() {
	long long t;
	cin >> t;
	while (t--) {
		cin >> a >> b >> k;
		long long  l = 0;
		long long  r = k;
		for (int i = 1; i <= 62; i++)
		{
			s[i] = ll(1ll << i);
		}
		ll  ans = 0;
		while (l <= r) {
			ll mid = (l + r) / 2;
			if (check(mid) == true) {
				l = mid + 1;
				ans = mid;
			}
			else
				r = mid - 1;
		}
		cout << ans<< endl;
	}
	return 0;

}

来纪念一下吧。。。


大号上是6.5开始重写比赛的题的-.- 样例有个球用  有个球用...  一度..

.....

看上去也不多但是整个题的脉络都那样了..还是在WA 就.. 很难受()

又不想问( ) 几乎崩溃

=======6.7更新 tmd一度搞得我很想哭(这是还没A的时候)

多简单的东西啊 我不想被你看不起啊 我就要搞这么久 一直搞这么久

最开始改了一下除完的情况(就是 太大了溢出了嘛  而且我们知道 取值1 1 的时候和10 10 的时候都要满足 是没有办法的  所以不能用区间的界来定  可以逆运算 就是除回去 或者仅仅是一直乘 乘到后来大于他位置为止)

有个小地方就是传入的k要变化所以是tempk

抽特王让我试一下样例1 10 1e18(还是10 1 1e18)是52

我说33 别人A掉的程序也是33 我改了半天是自己少加了两个0

不要被看不起 不要被看不起 不要 绝对不要

这种感觉太难受了 大概在26A的wjh面前又是这样吧

我不要 我才不要

非常非常不想问你  非常想自己解决  非常非常想

不想什么事情都要问 这个不会那个不懂 妈的我是什么啊

可是我为什么就是做不到呢?

然后换了long  double 还是不过 对比了下别人的也还不知道错在哪了

【一般来说 上界下界都试一下吧-。- 比如那个1 1 (1的时候return true,否则会出现整除0的错误。)】



(代码)

(ceil那里注意括号的位置)

“你这不是和她一样的错法吗”

“我一看就知道你们肯定过不了 ”

因为强队都WA了一发, 你知道这代表什么吗

“样例对?样例对有个球用”

另:

科学计算器的用法算log

(1)计算器上自动以10为底的,所以

如果你输入log10的话,就是求以10为底的10的对数,答案为1

如果你要求不是以10为底数的对数的话,如求log5(25),你就输入log25/log5 ,答案为2

(2)1.C程序默认log()是取自然对数为底,即ln.


2.直接用换底公式,写个简单的表达式就完成了。
例如:log2 x写成:log(x)/log(2).

(3)http://www.99cankao.com/numbers/log-antilog.php

对数计算器.....

矩阵什么的都有 (云算子)



附:(能不能缩小的??)要先按了25再log...场上的话,计算器能用都用起来吧0.0



就像撒上碘酒是为了消毒 而用橡皮筋勒住手臂是为了让青筋暴露,泥也没必要每时每刻都和我呆在一起


====题外话

最近感觉效率还挺高的-.-可是刚刚补完实验报告又觉得根源都在把时间浪费完了..

还是效率啊...有的时候可能就需要一点点灵性。比如SQL里面几句话……

再比如1/(2的n次方)其实就是(1/2)的n次方.....p级数是(1/n的p次方,n是变量,p固定的)

if(

        select count(*)

        from Wangrx_Students,inserted,Wangrx_kc

--意思是每次对这两个表执行插入操作的时候触发器被触发

        where

        Wangrx_Students.wrx_Sxh=

        inserted.wrx_Sxh

--意思是在Sxh这一列新插入的等于已经插入的

        and

--在kch这一列也是新插入的等于已经插入的

--一般情况下就是插入的等于已经插入的时会有约束,触发器就开始执行了……

        inserted.wrx_kch

        = Wangrx_kc.wrx_kch

        )=0

--但是这里条件是0,也就是上面为假,这段代码的意思就是只能插入已经插入过的

--(虽然实际上都是反着用的)

rollbacktransaction       

--然后我们可以看到,插入了个新的1998是不能执行的因为没有被插入过

--但是9是可以的……因为之前有9(参见建立的原表)

英文单词的意思是 rollback 反转 (压制的意思在里面)transaction只 是事务而已

哎 总结下来还是要加强动手能力和理解能力啊加油

 

可能还是三年最好的时光都学了文吧=.=  我是真的好想把理科学好啊

因为因为理科有意思呀!!啊啊加油ヾ(◍°∇°◍)ノ゙

....即使我~

啊  能走一步是一步 对嘛

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值