LOJ1008 Fibsieve's Fantabulous Birthday 数学
题面
https://vjudge.net/problem/LightOJ-1008
分析
简单的数学题。
首先能推出一个规律:行数为奇数/偶数时,横纵坐标的变化顺序是一致的,比如行数为奇数时,纵坐标的取值是[1],[5 6 7],[17 18 19 20 21]...,横坐标的取值是[1],[9 8 7],[25 24 23 22 21]...。
剩下的部分一个个考虑:
①怎么判断数在第几行:
设在第行,第行表示为行。
容易发现,边长为的矩阵的最大值为。故边长为矩阵的最外层的数范围为(如时,最外层就是)。
那么一定满足,即:
②怎么判断数在右侧还是上侧:
很显然,只需要与的对角线元素相比即可。
设对角线上坐标为的值为。容易发现的差分数列是个首项为的等比数列。
易推出。
显然,当为奇数时:
-
若,则
-
若,则
-
若,则
当为偶数时:
-
若,则
-
若,则。
-
若,则
可以发现,奇偶行的横纵坐标其实只是颠倒了过来,完全不用独立分析。
Code
void solve(int T, LL s) {
if (s == 1) {
printf("Case %d: 1 1\n", T);
return;
}
LL x = 0, y = 0;
LL t = (LL) ceil(sqrt(s)), t2 = (LL) floor(sqrt(s));
LL num = t * (t - 1) + 1;
if (t & 1LL) {
if (s < num) x = t, y = s - t2 * t2 * 1LL;
else if (s == num) x = t, y = t;
else x = t * t * 1LL - s + 1, y = t;
} else {
if (s < num) x = s - t2 * t2 * 1LL, y = t;
else if (s == num) x = t, y = t;
else x = t, y = t * t * 1LL - s + 1;
}
printf("Case %d: %lld %lld\n", T, x, y);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!