ztr loves math
Accepts: 315
Submissions: 1975
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
问题描述
ztr喜欢研究数学,一天,他在思考直角三角形方程组的Lower版,即n=x2−y2,他想知道,对于给出的n,是否会有正整数解。
输入描述
有T组数据,第一行为一个正整数T(T<=106),每一行一个正整数n,n<=1018
输出描述
如果有正整数解,输出True,否则输出False
输入样例
4 6 25 81 105
输出样例
False True True True
解:
考虑题目的原型,即给定z,寻找是否存在一组(x,y),满足x2−y2=z
我们可以构造两组等式[(k+1)2−k2=2k+1(k+1)2−(k−1)2=4k], 很容易得出结论,当z为奇数或者4的倍数时,方程一定有正整数解
其实本来可以高精度的但是。。[捂脸熊省流量版.jpg]
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define LL __int64
int main()
{
LL t;
scanf("%I64d",&t);
while(t--)
{
LL n;
scanf("%I64d",&n);
if((n&1&&n!=1)||(n%4==0&&n!=4))
printf("True\n");
else
printf("False\n");
}
return 0;
}
ztr loves lucky numbers
Accepts: 99
Submissions: 736
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
问题描述
ztr喜欢幸运数字,他对于幸运数字有两个要求 1:十进制表示法下只包含4、7 2:十进制表示法下4和7的数量相等 比如47,474477就是 而4,744,467则不是 现在ztr想知道最小的但不小于n的幸运数字是多少
输入描述
有T(1≤T≤105)组数据,每组数据一个正整数n,1≤n≤1018
输出描述
有T行,每行即答案
输入样例
2 4500 47
输出样例
4747 47
Hint
请尽可能地优化算法,考虑全面
解:直接暴力显然TLE,考虑按位DFS
每一位只可能是4或7
所以根据这个来DFS即可,时间复杂度O(T∗2log10n)
考虑到T特别大,不可能每次都DFS
而经过计算,218=262144,所以全部储存下来
对于每次询问,二分即可
考虑一个边界条件,即当结果爆ll怎么办?
即答案应当为10个4、10个7的时候,显然unsigned long long也不行
那么只能采用特判了
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define LL unsigned long long
const LL maxm=1e7+10;
LL ans[maxm];
LL M;
LL cnt;
LL check(LL p)
{
LL temp=p;
LL len4=0,len7=0;
while(temp)
{
LL k=temp%10;
if(k==4)
len4++;
else
len7++;
temp/=10;
}
if(len4==len7)
return 1;
return 0;
}
void dfs(LL cur)
{
if(cur>M)
return;
if(cur<=M&&check(cur)&&cur!=0)
{
ans[cnt++]=cur;
}
for(LL i=1; i<=2; i++)
{
if(i==1)
cur=cur*10+4;
else if(i==2)
cur=cur*10+7;
if(cur<=M)
{
dfs(cur);
cur/=10;
}
}
}
int main()
{
cnt=0;
M=1e18;
dfs(0);
sort(ans,ans+cnt);
//printf("%I64d\n",ans[1]);
LL t;
scanf("%I64d",&t);
while(t--)
{
LL n;
scanf("%I64d",&n);
if(n>ans[cnt-1])
printf("44444444447777777777\n");
else
{
LL m=lower_bound(ans,ans+cnt,n)-ans;
printf("%I64d\n",ans[m]);
}
}
}