Problem E. Matrix from Arrays HDU - 6336 (容斥,打表找规律)

Problem E. Matrix from Arrays

 题目链接:HDU - 6336 

题意:按照题目方法构造一个矩阵,给出左上角和右下角的坐标问以两点连线为对角线的矩阵的和;

思路:打表发现,当L是奇数时,构造的矩阵是一个L*L的循环矩阵;L是偶数时,构造的矩阵是一个2L*2L的循环矩阵;那么统一把循环节设为2L即可;先打表构造出循环矩阵,求前缀和sum[i][j];最好让矩阵的x, y都从1开始;将题目给出的稍微修改一下就可以了;

 

Problem E. Matrix from Arrays HDU - 6336 (容斥,打表找规律)_第1张图片        Problem E. Matrix from Arrays HDU - 6336 (容斥,打表找规律)_第2张图片  

                     (图一)                                                   (图二)

Problem E. Matrix from Arrays HDU - 6336 (容斥,打表找规律)_第3张图片

             (图三)     

如图一:以3*3的循环矩阵为例,紫色矩阵是目标矩阵,可以转化成图二,根据容斥原理S=S1-S2-S3+S4;;S1, S2, S3, S4都是以(x, y)为右下角,以(0, 0)为左上角的矩阵,问题就转化成了求这样的矩阵图三;米黄色的面积表示有多少个完整的循环矩阵,下方白条及右方白条表示只有长或宽不完整的矩阵,橙黄色面积表示不完整的循环矩阵;

 

注意要用long long;

#include 
using namespace std;
typedef long long ll;
ll len, M[110][110], sum[25][25], a[20];
ll Sum(ll x, ll y){
	ll ans=(x/len)*(y/len)*sum[len][len];//求米黄色部分和;
	ans+=sum[x%len][len]*(y/len)+sum[len][y%len]*(x/len);//求白条部分和
	ans+=sum[x%len][y%len];//求橙黄色部分和;
	return ans;
}
int main(){
	int T;
	scanf("%d", &T);
	while(T--){
		ll L;
		scanf("%lld", &L);
		for(ll i=0; i

 

 

你可能感兴趣的:(计算几何,思维,模拟)