zoukankan      html  css  js  c++  java
  • 洛谷P4296 [AHOI2007]密码箱

    题目

    链接

    分析

    一道有点意思的题目...

    主要难点在于想到移项,就是把原式转化成平方差的形式,然后把(n)拆分成(a,b)

    这样做了之后我们就发现(a)整除((x-1))(b)整除((x+1))或者(a)整除((x+1))(b)整除((x-1))的时候,(x)满足题意

    枚举(a)(k*b+1,k*b-1),然后判断这个(k*b+1(-1))是否被(a)整除即可

    代码

    #include<bits/stdc++.h>
    using namespace std;
    template <typename T>
    inline void read(T &x){
    	x=0;char ch=getchar();bool f=false;
    	while(!isdigit(ch)){if(ch=='-'){f=true;}ch=getchar();}
    	while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    	x=f?-x:x;
    	return ;
    }
    template <typename T>
    inline void write(T x){
    	if(x<0) putchar('-'),x=-x;
    	if(x>9) write(x/10);
    	putchar(x%10^48);
    	return ;
    }
    #define ll long long
    ll n,now;
    set<ll> s;
    int main(){
    	read(n);
    	if(n==1){
    		puts("None");
    		return 0;
    	}
    	s.insert(1);
    	now=sqrt(n);
    	for(ll i=1;i<=now;i++){
    		if(n%i==0){
    			ll b=n/i;
    			for(ll j=b+1;j<=n;j+=b) if((j+1)%i==0) s.insert(j);
    			for(ll j=b-1;j<=n;j+=b) if((j-1)%i==0) s.insert(j);
    		}
    	}
    	if(!s.size()) puts("None");
        for(set<ll>::iterator it=s.begin();it!=s.end();it++) write(*it),putchar('
    ');
    	return 0;
    }
    
    
  • 相关阅读:
    单调栈问题解析
    Linux进程状态切换
    Shell编程小例子
    Linux之shell编程
    树的遍历框架
    你真的会求1-100有多少个素数吗
    java实现LRU算法
    从上到下打印二叉树 III
    从上到下打印二叉树I
    模拟盘电路板调试过程中出现的问题
  • 原文地址:https://www.cnblogs.com/Akmaey/p/14099375.html
Copyright © 2011-2022 走看看