CSUSTOJ|你真的会数三角形吗?

呜呜呜哥哥太厉害了()

CSUST4013|你真的会数三角形吗?

先通过勾股定理(或者三角形相似)列出表达式,最终可以得到:

( n n n为正方形边长)
∣ D F ∣ = n − ∣ C E ∣ + ∣ C E ∣ 2 n |DF|=n-|CE|+\frac{|CE|^2}{n} DF=nCE+nCE2

并且 ∣ D F ∣ , ∣ C E ∣ |DF|,|CE| DF,CE的长度都是整数。

也就是找到有多少个 ∣ C E ∣ < N |CE|<N CE<N,并且 ∣ C E ∣ 2 |CE|^2 CE2能被 n n n整除。

如果直接暴力,复杂度巨高,肯定会超时,那么考虑优化。

k ∗ n = y 2 k*n=y^2 kn=y2,找有几个 y y y就是找有几个 k k k使得 k ∗ n k*n kn为平方数,并且 k < n k<n k<n

继续想,如果 n n n本身就是一个平方数,那么 k k k也是平方数;如果 n n n不是平方数,那么考虑让 n n n除一个数 w w w使其成为平方数。即:
w ∗ n ∗ k ′ = y 2 w*n*k'=y^2 wnk=y2 k ′ k' k也是平方数且 k ′ < n w k'< \frac{n}{w} k<wn,算出范围内 k ′ k' k的个数,即 n w − 1 \sqrt{\frac{n}{w}}-1 wn 1.

ac代码如下,代码很好写,重点是思路。

int main(){
    int T;
    cin>>T;
    while(T--){
        ll n;
        cin>>n;
        ll m=n;
        //分解n
        ll x=sqrt(n);
        ll res=1;
        for(int i=2;i<=x;i++){
            int cnt=0;
            while(n%i==0){
                cnt++;
                n/=i;
            }
            if(cnt%2==1){
                res*=i;
            }
        }
        if(n!=1){
            res*=n;
        }
        x=sqrt(m/res);
        cout<<x-1<<endl;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KaaaterinaX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值