I题
求 a 数组平方的前缀和和求 a 数组后缀和,遍历一遍即可
AC代码
#include<iostream>
#include<cmath>
using namespace std;
int a[1000005];
long long l[1000005], r[1000005];
int main(){
int i,n;
cin>>n;
long long int sum;
for(i=0;i<n;i++){
cin>>a[i];
}
l[0]=a[0]*a[0];
for(i=0;i<n;i++){
l[i]=l[i-1]+a[i]*a[i];
}
for(i=n-1;i>=0;i--){
r[i]=r[i+1]+a[i];
}
for(i=0;i<n;i++){
sum=max(sum,l[i]*r[i+1]);
}
cout<<sum<<endl;
return 0;
}
F题
若 n % 2 == 0 且 n % 4 != 0,n = (m - k)(m + k)
AC代码
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<string>
#include<map>
#include<sstream>
#include<cstring>
using namespace std;
/*题意就是求满足n=m^2-k^2的任意一组m和k的解
m^2-k^2=(m+k)*(m-k)
可以把n分为奇数和偶数两种情况
*/
int main()
{
long long n,s,m,k,i,j,p=0;
cin>>n;
if(n%2==0)//n是偶数
{
for(i=2; i*i<=n; i+=2)//找出n的两个因子i和j,且i*j==n,i<j
{
if(n%i==0)//先找出因子i
{
j=n/i;//再求出另一个因子j,列一个方程组:m+k=i,m-k=j,求m和k
if((j+i)%2==0)//这一步相当于解方程组,如果j+i为偶数说明方程组有解
{
m=(j+i)/2;
k=(j-i)/2;
cout<<m<<" "<<k<<endl;
p=1;
break;
}
if(p==1)
{
break;
}
}
}
if(p==0)
{
cout<<"impossible"<<endl;
}
}
else//n是奇数时有一种情况一定是对的,就是m+k=n,m-k=1的情况,所以n/2=k,k+1=m。比如15=15*1=(8+7)*(8-7)
{
s=n/2;
cout<<s+1<<" "<<s<<endl;
}
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<string>
#include<map>
#include<sstream>
#include<cstring>
using namespace std;
/*题意就是求满足n=m^2-k^2的任意一组m和k的解
m^2-k^2=(m+k)*(m-k)
可以把n分为奇数和偶数两种情况
*/
int main()
{
long long n,s,m,k,i,j,p=0;
cin>>n;
if(n%2==0)//n是偶数
{
for(i=2; i*i<=n; i+=2)//找出n的两个因子i和j,且i*j==n,i<j
{
if(n%i==0)//先找出因子i
{
j=n/i;//再求出另一个因子j,列一个方程组:m+k=i,m-k=j,求m和k
if((j+i)%2==0)//这一步相当于解方程组,如果j+i为偶数说明方程组有解
{
m=(j+i)/2;
k=(j-i)/2;
cout<<m<<" "<<k<<endl;
p=1;
break;
}
if(p==1)
{
break;
}
}
}
if(p==0)
{
cout<<"impossible"<<endl;
}
}
else//n是奇数时有一种情况一定是对的,就是m+k=n,m-k=1的情况,所以n/2=k,k+1=m。比如15=15*1=(8+7)*(8-7)
{
s=n/2;
cout<<s+1<<" "<<s<<endl;
}
return 0;
}
}