链接:戳这里
思路:
n=x^2-y^2=(x+y)*(x-y) n能整除(x+y)并且n能整除(x-y)
并且(x+y)=a 和 (x-y)=b a + b 这两个数相加和要为偶数
1:a,b要能被n整除
2:a,b必须均为奇数或者偶数
=>假设a=1时那么只需要b=n 并且n为奇数就可以 所以当n为奇数且n不为1时 True
=>假设a b均为偶数 所以n必须整除4 且n!=4 答案为True
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<string> #include<vector> #include <ctime> #include<queue> #include<set> #include<map> #include<stack> #include<iomanip> #include<cmath> #define mst(ss,b) memset((ss),(b),sizeof(ss)) #define maxn 0x3f3f3f3f #define MAX 1000100 ///#pragma comment(linker, "/STACK:102400000,102400000") typedef long long ll; typedef unsigned long long ull; #define INF (1ll<<60)-1 using namespace std; ll n; int main(){ int T; scanf("%d",&T); while(T--){ scanf("%I64d",&n); if(n==1) { printf("False\n"); continue; } if(n%2) printf("True\n"); else if(n%4==0 && n!=4) printf("True\n"); else printf("False\n"); } return 0; }
思路:
先把1~1e18范围内的满足只为4,7且个数相等的数先DFS出来
然后二分找出不小于n的数lower_bound()...
但是这里有一个hack点 就是当n==0 或者 n>444444444777777777时 分别输出47 和 44444444447777777777
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<string> #include<vector> #include <ctime> #include<queue> #include<set> #include<map> #include<stack> #include<iomanip> #include<cmath> #define mst(ss,b) memset((ss),(b),sizeof(ss)) #define maxn 0x3f3f3f3f #define MAX 1000100 ///#pragma comment(linker, "/STACK:102400000,102400000") typedef long long ll; typedef unsigned long long ull; #define INF (1ll<<60)-1 using namespace std; ll n; ll a[1000100]; int tot; bool pd(ll t){ int a=0,b=0; while(t){ if(t%10==4) a++; else b++; t/=10; } if(a==b) return true; return false; } void DFS(int x,ull t){ if(t>1e18 || x>18) return ; if(pd(t) && t) a[tot++]=t; DFS(x+1,t*10+4); DFS(x+1,t*10+7); } void init(){ tot=0; DFS(0,0); sort(a,a+tot); /*cout<<tot<<endl; for(int i=0;i<tot;i++) cout<<a[i]<<" "; cout<<endl;*/ } int main(){ init(); int T; scanf("%d",&T); while(T--){ scanf("%I64d",&n); int x=lower_bound(a,a+tot,n)-a; if(a[tot-1]<n) printf("44444444447777777777\n"); else printf("%I64d\n",a[x]); } return 0; }