bzoj1406: [AHOI2007]密码箱

划水摸鱼。。。唔唔唔好困。。。被课内D爆 惨啊

这题就是k^2-1=n*d 求k的解嘛

变形一下 (k+1)(k-1)=n*d

分解一波质因数,我们可以搞成k+1=n1*d1,k-1=n2*d2

枚举一下乱搞就好

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<set>
using namespace std;
typedef long long LL;

set<LL>s;
set<LL> :: iterator it;
int ylen;LL yue[110000];
int main()
{
    LL n;
    scanf("%lld",&n);
    if(n==1){printf("None\n");return 0;}
    
    for(LL i=1;i*i<=n;i++)
        if(n%i==0)yue[++ylen]=n/i;
        
    s.insert(1);
    for(int i=1;i<=ylen;i++)
        for(int j=1;yue[i]*j-1<=n;j++)
        {
            if((yue[i]*j+2)%(n/yue[i])==0&&yue[i]*j+1<=n)s.insert(yue[i]*j+1);
            if((yue[i]*j-2)%(n/yue[i])==0&&yue[i]*j-1>=0)s.insert(yue[i]*j-1);
        }
    
    for(it=s.begin();it!=s.end();it++)printf("%lld\n",*it);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/AKCqhzdy/p/9076330.html