6
社区成员
发帖
与我相关
我的任务
分享这是平方和公式做的
#include<iostream>
using namespace std;
int main(){
long long a,b;
cin>>a>>b;
long long min=0;
for(long long i=a;i<=b;i++){
long long tst=sqrt(i);
if(tst*tst==i){
min=tst;
break;
}
}
long long max=0;
for(long long i=b;i>=a;i--){
long long tst=sqrt(i);
if(tst*tst==i){
max=tst;
break;
}
}
min-=1;
cout<<((max*(max+1)*(2*max+1))/6 - (min*(min+1)*(2*min+1))/6)%INT_MAX ;
}
//min是范围内第一个完全平方数,max是最后一个/就是只要我用平方和公式把1-max的平方和减去1-min-1的平方和就是范围内所有完全平方数和
这是累加完全平方数暴力做的
#include<iostream>
using namespace std;
long long llsqrt(long long a){
long long b=(long long)sqrt(a);
return b;
}
long long sqrtst(long long a,long long b){
if(a > b) return 0;
long long sum=0;
long long fst;
int s=0;
for(long long i=a;i<=b;i++){
long long tst=(long long)sqrt(i);
if(tst*tst==i){
fst=i;
s=1;
break;
}
}
if(s==0){
return 0;
}
for(long long i=fst;i<=b;i+=llsqrt(i)*2+1){
sum+=i;
sum%=INT_MAX;
}
return sum;
}
int main(){
long long a,b;
cin>>a>>b;
cout<<sqrtst(a,b);
}
/*原理是两个完全平方数之间是连续奇数关系也就是假设完全平方数a是b的平方 则下一个完全平方数是a+2b+1
当然也可以直接sqrt(a)+1平方
*/
两个我都模了INT_MAX也就是2^31-1但是当我把测试点变成1 10000000000000时两个代码之间偏差了2
也就是说有一个代码逻辑错了或者说有什么地方超出了,所以到底我没考虑到哪里(如果我在平方和公式计算过程中模偏差更大)