首页 > 其他分享 >题解:擬二等辺三角形

题解:擬二等辺三角形

时间:2024-10-14 18:48:51浏览次数:6  
标签:三边 题解 ll long 二等 等腰三角 res 三角形

Problem Link

擬二等辺三角形

题面翻译

定义一个三角形为“伪等腰三角形”需满足以下三个条件:

  • 三边长度都为自然数。

  • 三边长度各不相同。

  • 有其中两条边的长度之差为 \(1\)。

现在给你一个数 \(n\),求周长小于等于 \(n\) 的“伪等腰三角形”个数,答案对 \(1000000007\) 取模。

Solution

不难发现周长最小的“伪等腰三角形”的三边长为 \((2, 3, 4)\),故若给出的 \(n\) 需大于 \(8\)。

锚定 \(b = a+1\),对 \(n\) 进行奇偶性讨论(令三角形表示为 \((a, b, c)\))。

\(n\) 为偶数。

设 \(res\) 为构成 \((2, 3, 3)\) 之后剩下的值(即 \(n-8\)),不难发现把余下的值 对半 任意放到 \((2, 3)\) 中即可,方案数即为(式子中的 \(res\) 由前文已除以 \(2\)):

\[ {res \times(res+1) \div 2} \]

\(n\) 为奇数

设 \(res\) 为构成 \((2, 3, 2)\) 之后剩下的值(即 \(n-7\)),与偶数类似,只是 \((2, 3)\) 中至少要放 \(1\) 使得“三边长度各不相同”。

代码

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
#define Mod 1000000007
#define getchar()(p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[1<<21], *p1 = buf, *p2 = buf;
inline ll lread(ll x=0, bool f=0, char c=getchar()) {for(;!isdigit(c);c=getchar()) f^=!(c^45);for(;isdigit(c);c=getchar()) x=(x<<1)+(x<<3)+(c^48);return f?-x:x;}

ll n;

ll hts(ll a, ll b)
{
    ll res = 1;
    while(b) 
    {
        if( b & 1 ) (res *= a) %= Mod;
        (a *= a) %= Mod, b >>= 1;
    }
    return res;
}

ll solve(ll n)
{
    if( n <= 8 ) return 0;
    if( (n & 1) == 0 ) {ll res = (n-8) / 2  % Mod; return res * ((res+1) % Mod) % Mod * hts(2, Mod-2) % Mod;}
    else {ll res = (n-7)/ 4 % Mod; return ( res * 2 % Mod * res % Mod + ((n-7)/2 & 1 ? res*2+1 : 0 ) % Mod) % Mod;}
}

int main()
{
    n = lread();
    printf("%lld\n", solve(n));
    return 0;
}

Tips

  • \(10^{12}\) 的输入已经爆 int 了,需要开 long long

  • 记得特判 \(n\) 小于等于 \(8\) 的情况。

标签:三边,题解,ll,long,二等,等腰三角,res,三角形
From: https://www.cnblogs.com/naughty-naught/p/18464770

相关文章

  • 题解:AT_abc370_c [ABC370C] Word Ladder
    题目传送门luogu观看简要题意给两个序列\(S\)和\(T\),输出的第一个数是它能改变的总个数,后面跟着的第\(i\)个是改变\(i\)个数之后,字典序最小的结果。思路当\(S\)与\(T\)相等的话,那就无法改变了,直接输出\(0\)。对于总数只要\(T_i\neS_i\)那它就可以改,所以只......
  • 题解:P1660 数位平方和
    ProblemLinkStep1:“定义\(S(n)\)表示\(n\)个的各个数位的\(k\)次方的和。”数位的\(k\)次方,我们可以通过快速幂求出,为了节省时间,我们可以定义一个\(a\)数组,来表示\(0\sim9\)区间中各数字\(k\)次方的值。然后我们通过定义一个\(s\)数组来存储\(0\sim4\times......
  • 题解:P7356 「PMOI-1」游戏
    ProblemLink「PMOI-1」游戏题意给你一个胜利规则为黑白白白的棋类游戏,你执白,黑先行且第一步必下\((0,0)\),双方皆可放弃落子且落子坐标必须为自然数,请在4步内获胜。思路在自己与自己对下几局之后,有几个显然的发现:黑棋会尽量阻止你4步获胜。在你不会再下一步就获......
  • 题解:AT_agc027_b [AGC027B] Garbage Collector
    ProblemLink[AGC027B]GarbageCollector题意原题翻译已经很不错了,这里不再赘述。思路推论:每次取的垃圾数量应尽可能均分。证明如图,假设有\(4\)个垃圾需要被捡起,有两种取法:取一号垃圾+取二三四号垃圾。取一二号垃圾+取二三号垃圾。前者所需能量为:\(\display......
  • [2024领航杯] Pwn方向题解 babyheap
      [2024领航杯]Pwn方向题解babyheap前言:当然这个比赛我没有参加,是江苏省的一个比赛,附件是XiDP师傅在比赛结束之后发给我的,最近事情有点多,当时搁置了一天,昨天下午想起来这个事情,才开始看题目,XiDP师傅说是2.35版本的libc,确实高版本libc的却棘手,我经验太浅了调试半天,最后让我们......
  • CF360B题解
    简述题意定一个数列\(a\),可以对其中的元素做至多\(k\)次修改,每次修改可以将数列中的一个数改成另一个。求经过修改后,\(max_{i=1}^{n}|a_i-a_{i-1}|\)思路考虑二分答案,对于check函数,我们可以利用dp进行求解。由于修改不太好想,我们可以把问题转换为让不被修改的数最多......
  • CF1814B. Long Legs 题解 枚举
    题目链接:https://codeforces.com/problemset/problem/1814/B题目大意有一个无限大的二维平面,我们用\((x,y)\)来表示平面中横坐标为\(x\)纵坐标为\(y\)的那个位置。一个机器人被放置在该二维平面的\((0,0)\)位置中。该机器人的腿长可以调节。最初,它的腿长为\(1\)。......
  • 【题解】Solution Set - NOIP2024集训Day50 图的连通性相关
    【题解】SolutionSet-NOIP2024集训Day50图的连通性相关https://www.becoder.com.cn/contest/5618「JSOI2012」越狱老虎桥简述题意:题目大意:给定一张图,A先添加\(1\)条边,B再删去一条边使得图不连通,A要最大化删除边的权值,B要最小化删除边的权值,问最终的权值是多少。......
  • CSS绘制三角形
    其实画三角形只要打开思路就会很简单这是隐藏内容这是隐藏内容这是隐藏内容这是隐藏内容这是隐藏内容这是隐藏内容目录边框常识这是隐藏内容这是隐藏内容这是隐藏内容这是隐藏内容这是隐藏内容边框操作这是隐藏内容这是隐藏内容这是隐藏内容这是隐藏内容这是隐藏内容......
  • qoj8528 Chords 题解
    数据随机有什么用?用你惊人的注意力可以观察到答案的值域在\(800\)附近。考虑暴力dp,设\(dp_{l,r}\)表示值域在\([l,r]\)中最多能选几个区间。假设\(r\)对应区间的左端点为\(lst\),那么有转移方程\(dp_{l,r}=dp_{l,lst-1}+dp_{lst+1,r-1}+1\)。时间复杂度\(O(n^2)\)。......