CF215C 题解
翻译
有一个
我们用一个六元组
若一个方格
-
|x-x0|\le a$ 且 $|y-y0|\le b -
|x-x0|\le c$ 且 $|y-y0|\le d
已知一个十字形的面积是
题解
翻译题目中的两个条件:
或
而这两个条件其实是分别表示了一个矩形再将这两个矩形取并集而形成的十字型。
这是一个由
定义条件中的
对了,一个矩形也可以是一个十字形,比如六元组
注意到
- 等于
s
那就直接看一下整个大矩阵里有多少个
ll F(ll x,ll y)
{
return (n-x+1)*(m-y+1);
}
- 不等于
s
看一下需要在这个矩形左右两侧或上下两侧“补”多少格子
能否补,必须看剩下的面积是否是偶数,因为十字形是轴对称的,如果你左右或上下两侧不对称的话就不是十字形了。
再枚举一个
综上,由于只要六元组中表示中心点的参数(x0,y0)不相同,算作多种方案,所以第二种情况也需要乘以
code
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m;
ll F(ll x,ll y)
{
return (n-x+1)*(m-y+1);
}
int main()
{
ll s,i,j,k,res=0;
scanf("%lld %lld %lld",&n,&m,&s);
for(i=1;i<=n;i+=2)
{
for(j=1;j<=m;j+=2)
{
ll s0=i*j;
if(s0==s) res+=(((i-1)/2+1)*((j-1)/2+1)*2-1)*F(i,j);
else if(s0<s)
{
s0=s-s0;
for(k=1;k<j;k+=2)
if(!(s0&1) && s0%k==0 && i+s0/k<=n) res+=2*F(i+s0/k,j);
}
}
}
printf("%lld",res);
return 0;
}