ICPC训练联盟周赛Preliminaries for Benelux Algorithm Programming Contest 2019

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;
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/nanan/p/12511893.html