Cod sursa(job #931318)

Utilizator rudarelLup Ionut rudarel Data 28 martie 2013 10:10:07
Problema Dreptunghiuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>
#define MAX 400
 
using namespace std;
 
int nl, nc;
int sqr[MAX*MAX+1];
 
void S(){
    int i;
    for(i=1; i<=MAX; i++)
        sqr[i*i]=i;
}
 
int solve(int h, int w, int a){
    int F=0;
    int d;
    int c1, c2;
    if(w*w-4*a*(h-a)==0)
        d=0;
    else if(w*w-4*a*(h-a)>0 && sqr[w*w-4*a*(h-a)])
        d = sqr[w*w-4*a*(h-a)];
    else d=-1;
 
    if(d>=0)     {
        c1=(w+d)/2;
        c2=(w-d)/2;
 
        if(c1==c2)
            if(w%2==0 && c1<w && c1>=0)
                F=1;
            else F=0;
        else {
            if((w+d)%2==0 && 0<=c1 && c1<w)
                F++;
            if((w-d)%2==0 && 0<=c2 && c2<w)
                F++;
        }
    }
    else F=0;
    return F;
}
 
 
int main(){
    int i, j, a;
    long long nr=0, SOL=0;
    ifstream f("dreptunghiuri.in");
    ofstream g("dreptunghiuri.out");
    f>>nl>>nc;
    S();
    if(nl>nc){
        i=nl; nl=nc; nc=i; }
    for(i=1; i<nl; i++) {
        for(j=i; j<nc; j++){
            for(nr=0, a=0; a<i; a++)
                nr += solve(i, j, a);
            if(i!=j){
                if(nl>i && nc>j) SOL += (nl-i)*(nc-j)*nr;
                if(nl>j && nc>i) SOL += (nl-j)*(nc-i)*nr;
            }
            else SOL+=(nl-i)*(nc-j)*nr;
        }
    }
    g<<SOL<<endl;
    f.close();
    g.close();
    return 0;
}