CSP模拟52联测14 A.长春花

文章讲述了在CSP模拟测试中,如何通过预处理和枚举策略求解一个关于素数p的数学问题,即找到使(a^2+b^2)modp=x成立的最小非负整数a。代码展示了暴力搜索和优化方法的应用。
摘要由CSDN通过智能技术生成

CSP模拟52联测14 A.长春花

题目大意

给定一个素数 p p p,对每个 0 ≤ x < p 0 \le x < p 0x<p,设 f ( x ) f(x) f(x) 表示一个最小的非负整数 a a a,使得存在一个非负整数 b b b,满足 ( a 2 + b 2 )   m o d   p = x (a^2+b^2) \bmod p = x (a2+b2)modp=x

现在,你想要求 max ⁡ { f ( 0 ) , f ( 1 ) , ⋯   , f ( p − 1 ) } \max\{ f(0), f(1), \cdots, f(p-1) \} max{f(0),f(1),,f(p1)} 的值。

思路

暴力搞一下发现 a a a 很小,所以就预处理一下 b [ i 2 m o d    p ] = 1 ( i ∈ [ 0 , p ] ) b[i^2 \mod p] = 1 (i\in[0 , p]) b[i2modp]=1(i[0,p])

然后就每个 a a a 枚举一下就好了

code

#include <bits/stdc++.h>
#define fu(x , y , z) for(long long x = y ; x <= z ; x ++)
using namespace std;
long long p , b[10000005];
int main () {
    freopen ("A.in" , "r" , stdin);
    freopen ("A.out" , "w" , stdout);
    scanf ("%d" , &p);
    fu (i , 1 , p) {
        b[(i * i) % p] = 1;
    }
    long long ans = 0;
    fu (i , 0 , p) {
        fu (j , 0 , p) {
            if (b[(1ll * (i + p) - 1ll * j * j % p) % p]) {
                ans = max (ans , j);
                break;
            }
        }
    }
    printf ("%d" , ans);
    return 0;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值