其实就是个二分,使用抽特王无敌模板可以解决……可以解决……样例……
……但是越到后面就会发现有矛盾,因为会溢出
虽然你给了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只 是事务而已
哎 总结下来还是要加强动手能力和理解能力啊加油
可能还是三年最好的时光都学了文吧=.= 我是真的好想把理科学好啊
因为因为理科有意思呀!!啊啊加油ヾ(◍°∇°◍)ノ゙
....即使我~
啊 能走一步是一步 对嘛