首页 > 其他 > 详细

51nod - 1659 - 数方块 - 简单数学

时间:2019-05-24 19:47:03      阅读:151      评论:0      收藏:0      [点我收藏+]

https://www.51nod.com/Challenge/Problem.html#!#problemId=1659
随便弄了一下发现公式,然后从cheatsheet抄一抄平方和公式,发现可以提公因式。
提完发现可以放缩估计出n的上界,复杂度可行。
然后是怎么求m。

一开始弄了个假算法,要求每一步都是整数,其实并不是这样。

经过一顿处理,又怕溢出ll这么麻烦。

最后分两步验证233。

保证结果是整数,那么参加加减法的都是整数,参加乘法的,把系数提到外面,然后保证里面是外面系数的倍数,这样刚好不会溢出。

然后顺手防一波n,m相等bug。

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

const int INF=0x3f3f3f3f;

int solve();

int main() {
#ifdef Yinku
    freopen("Yinku.in","r",stdin);
#endif // Yinku
    solve();
}

ll x;

vector<pair<ll,ll> >ans;

int solve() {
    while(~scanf("%lld",&x)) {
        ans.clear();
        for(ll n=1ll; n<=2000000ll; n++) {
            if((6ll*x)%(n*(n+1ll))) {
                continue;
            } else if(((6ll*x)/(n*(n+1ll))-(2ll*n+1ll))%3ll) {
                continue;
            } else {
                ll m=(6ll*x/(n*(n+1ll))-(2ll*n+1ll))/3ll+n;
                if(m>n) {
                    ans.push_back({n,m});
                    ans.push_back({m,n});
                } else if(m==n) {
                    ans.push_back({m,m});
                }

            }
        }
        sort(ans.begin(),ans.end());
        int n=(int)ans.size();
        printf("%d\n",n);
        for(int i=0; i<n; i++) {
            printf("%lld %lld\n",ans[i].first,ans[i].second);
        }
    }
}

51nod - 1659 - 数方块 - 简单数学

原文:https://www.cnblogs.com/Yinku/p/10919870.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!