• Peekaboo(2019年上海网络赛K题+圆上整点)


    题目链接

    传送门

    题意

    你的位置在(O(0,0))(A)的位置为((x_1,y_1))(B)的位置为((x_2,y_2)),现在已知(a=OA,b=OB,c=AB),问你有多少对满足题意的(A,B)

    思路

    由于(a,b,c)都是整数,(O,A,B)的坐标为整数,所以如果存在满足题意的点对,那么(a,b)一定是勾股数,且(a^2=x_1^2+y_1^2,b=x_2^2+y_2^2),所以我们可以通过求出所有的((x_1,y_1),(x_2,y_2))然后看(c)是否等于(AB)

    对于(a^2=x^2+y^2),此时要推荐一个优秀的视频,根据这个视频里面说的即可解决这题。

    如果没有时间看那么长的视频的可以看洛谷圆上整点的板题的题解里面的解释。

    代码

    #include <set>
    #include <map>
    #include <deque>
    #include <queue>
    #include <stack>
    #include <cmath>
    #include <ctime>
    #include <bitset>
    #include <cstdio>
    #include <string>
    #include <vector>
    #include <cassert>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <unordered_map>
    using namespace std;
    
    typedef long long LL;
    typedef pair<LL, LL> pLL;
    typedef pair<LL, int> pLi;
    typedef pair<int, LL> pil;;
    typedef pair<int, int> pii;
    typedef unsigned long long uLL;
    
    #define fi first
    #define se second
    #define lson rt<<1
    #define rson rt<<1|1
    #define lowbit(x) x&(-x)
    #define name2str(name) (#name)
    #define bug printf("*********
    ")
    #define debug(x) cout<<#x"=["<<x<<"]" <<endl
    #define FIN freopen("D://Code//in.txt","r",stdin)
    #define IO ios::sync_with_stdio(false),cin.tie(0)
    
    const double eps = 1e-8;
    const int mod = 1000000007;
    const int maxn = 1000000 + 7;
    const double pi = acos(-1);
    const int inf = 0x3f3f3f3f;
    const LL INF = 0x3f3f3f3f3f3f3f3fLL;
    
    int t, cnt;
    LL a, b, c;
    pair<pii,pii> vec[maxn];
    vector<pii> A, B;
    
    bool check(LL x1, LL y1, LL x2, LL y2) {
        return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) == c * c;
    }
    
    int gcd(int a, int b) {
        return b == 0 ? a : gcd(b, a % b);
    }
    
    void solve(LL x, LL d, vector<pii> &vec) {
        if(x == 1 || x % 4 != 1) return;
        for(int s = 1; 2LL * s * s <= x; ++s) {
            LL tmp = x - 1LL * s * s;
            int t = (int)sqrt(tmp);
            if(1LL * t * t != tmp) ++t;
            if(1LL * s * s + 1LL * t * t != x) continue;
            if(gcd(s, t) != 1) continue;
            if(s >= t) continue;
            vec.emplace_back((1LL * t * t - 1LL * s * s) * d, 2 * d * s * t);
        }
    }
    
    void GaussInteger(LL x, vector<pii> &vec) {
        for(int i = 1; 1LL * i * i <= x; ++i) {
            if(x % i) continue;
            solve(x / i, i, vec);
            if(1LL * i * i != x) solve(i, x / i, vec);
        }
    }
    
    void fillpoint(LL x, vector<pii> &vec) {
        int num = vec.size();
        for(int i = 0; i < num; ++i) {
            vec.emplace_back(vec[i].se, vec[i].fi);
        }
        for(int i = 0; i < 2 * num; ++i) {
            vec.emplace_back(vec[i].fi, -vec[i].se);
            vec.emplace_back(-vec[i].fi, vec[i].se);
            vec.emplace_back(-vec[i].fi, -vec[i].se);
        }
        vec.emplace_back(x, 0);
        vec.emplace_back(-x, 0);
        vec.emplace_back(0, x);
        vec.emplace_back(0, -x);
    }
    
    int main() {
    #ifndef ONLINE_JUDGE
        FIN;
        time_t startclock = clock();
    #endif // ONLINE_JUDGE
        scanf("%d", &t);
        while(t--) {
            scanf("%lld%lld%lld", &a, &b, &c);
            cnt = 0;
            A.clear(), B.clear();
            GaussInteger(a, A), GaussInteger(b, B);
            fillpoint(a, A), fillpoint(b, B);
            for(auto num1:A) {
                for(auto num2:B) {
                    if(check(num1.fi, num1.se, num2.fi, num2.se)) {
                        vec[++cnt] = make_pair(num1, num2);
                    }
                }
            }
            sort(vec + 1, vec + cnt + 1);
            printf("%d
    ", cnt);
            for(int i = 1; i <= cnt; ++i) {
                printf("%d %d %d %d
    ", vec[i].fi.fi, vec[i].fi.se, vec[i].se.fi, vec[i].se.se);
            }
        }
    #ifndef ONLINE_JUDGE
        time_t endclock = clock();
        printf("It costs %.3fs
    ", 1.0 * (endclock - startclock) / CLOCKS_PER_SEC);
    #endif // ONLINE_JUDGE
        return 0;
    }
    
    
  • 相关阅读:
    HTML <input> 标签的 maxlength 属性
    HTTP 方法:GET 对比 POST
    怎么在html页面和js里判断是否是IE浏览器
    一行神奇的javascript代码
    c# 数据库批量插入数据SqlBulkCopy 示例
    c# 多线程调用窗体上的控件 示例
    sqlserver查找使用了某个字段的所有存储过程
    SQL Server 数据库性能优化
    SQL语句的执行过程
    Sql Server- 性能优化辅助指标SET STATISTICS TIME ON和SET STATISTICS IO ON
  • 原文地址:https://www.cnblogs.com/Dillonh/p/11535199.html
Copyright © 2020-2023  润新知