HDU 4365

把涂色的格子按对称旋转至左上角。

当未涂色时,若要符合要求,则必须要求每一圈矩形都是上下左右对称的。注意是一圈的小矩形。对于N*N的阵,若最外层一圈的小矩形要符合要求,则(假设N%2==0)可以涂色的种数为K^(N/2)种。全个矩阵可涂色数为K^(N/2)*(N/2+1)/2。

接第一段,(N/2)*(N/2+1)/2即为左上角矩形的对角线以上的小矩形数。若移动后有小矩形被涂色,减去即可。

今天才做了两题。这一题的规律是在吃饭时想到的,而上一题,卡在了那个公式上。

好可怜的人啊。。。。还有一题,是组合数学,果然放弃了,不想做组合数学的题。

。。。

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int Mod=100000007;
struct Paint{
	int x,y;
}Ed[2050];

bool cmp(Paint a,Paint b){
	if(a.x<b.x) return true;
	else if(a.x==b.x){
		if(a.y<b.y)return true;
	}
	return false;
}

int quick(long long  a,long long  b,long long m){
	long long  ans=1;
    while(b){
        if(b&1){
            ans=(ans*a)%m;
        }
        b>>=1;
        a=(a*a)%m;
    }
    return (int)ans;
}

int main(){
	int n,m,k,pi;
	while(scanf("%d%d%d",&n,&m,&k)!=EOF){
		for(int i=0;i<m;i++){
			scanf("%d%d",&Ed[i].x,&Ed[i].y);
			Ed[i].x++; Ed[i].y++;
		}
		if(n%2)
		n++;
		pi=n/2;
		pi=pi*(pi+1)/2;
		int mid=n/2;
		for(int i=0;i<m;i++){
			if(Ed[i].x>mid) Ed[i].x=(n+1)-Ed[i].x;
			if(Ed[i].y>mid) Ed[i].y=n+1-Ed[i].y;
			if(Ed[i].x>Ed[i].y){
				int tmp=Ed[i].y;
				Ed[i].y=Ed[i].x;
				Ed[i].x=tmp;
			}
		}
		sort(Ed,Ed+m,cmp);
		if(m>=1) pi--;
		for(int i=1;i<m;i++){
			if(Ed[i].x==Ed[i-1].x&&Ed[i].y==Ed[i-1].y)
			continue;
			pi--;
		}
		printf("%d\n",quick((long long)k,(long long)pi,(long long)Mod)%Mod);
	}
	return 0;
}

  

时间: 2024-10-07 21:05:06

HDU 4365的相关文章

HDU 4365 Palindrome graph(几何变换+快速幂)

HDU 4365 题意:给你一个n*n的画,然后每个格子图上任意k种颜色之一,要求通过翻转旋转后与原图保持一致,且原图已有m个格子有颜色.求有多少种涂法? 思路: 可以发现,我们所求的画是个高度轴对称和中心对称的图形,我们沿两根对称轴与两根中心对称轴把图案切成八份,那么决定其涂色方案只需考虑其中一份即可,若其中一份有x个格子那么答案即是k^x. 然而还有一个条件,即已经有m个格子涂上了颜色,那么我们将m个格子映射至之前选择的八分之一区域内,表明该格子颜色已固定,假设有y个格子颜色已固定,那么答案

HDU 4365 正方形格子涂色中心对称轴对称的涂法有多少种-思维-(矩阵坐标关系&amp;快速幂取模)

题意:n*n的格子,涂色,有k种颜料,必须满足旋转任意个90度和翻转之后图片的样子不变,现在已经有m个格子涂过色了,问还有多少种涂法满足上述条件. 分析: 满足上述对称条件,那么涂色的种类问题我们可以放在正方形的一个角来做,因为一个角确定了其他角的颜色也就确定了. 以左上角的下半角为例.共有1+2+....+(n+1)/2个格子,然后记录涂过色的格子对应到这个三角形里的格子数目,用tot来记录,即每输入一个涂过色的格子的坐标我们就在这个三角形里找与之对应的坐标,用vis[][]数组标记是否已经计

HDU 4365——Palindrome graph——————【规律+快速幂】

Palindrome graph Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1727    Accepted Submission(s): 525 Problem Description In addition fond of programing, Jack also loves painting. He likes to dra

暑假集训-合训第9场

ID Origin Title   8 / 22 Problem A HDU 4358 Boring counting 35 / 52 Problem B HDU 4359 Easy Tree DP? 31 / 79 Problem C HDU 4362 Dragon Ball   1 / 2 Problem D HDU 4363 Draw and paint 18 / 56 Problem E HDU 4365 Palindrome graph   3 / 17 Problem F HDU 4

HDU 6203 ping ping ping [LCA,贪心,DFS序,BIT(树状数组)]

题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=6203] 题意 :给出一棵树,如果(a,b)路径上有坏点,那么(a,b)之间不联通,给出一些不联通的点对,然后判断最少有多少个坏点. 题解 :求每个点对的LCA,然后根据LCA的深度排序.从LCA最深的点对开始,如果a或者b点已经有点被标记了,那么continue,否者标记(a,b)LCA的子树每个顶点加1. #include<Bits/stdc++.h> using namespace std;

HDU 5542 The Battle of Chibi dp+树状数组

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5542 题意:给你n个数,求其中上升子序列长度为m的个数 可以考虑用dp[i][j]表示以a[i]结尾的长度为j的上升子序列有多少 裸的dp是o(n2m) 所以需要优化 我们可以发现dp的第3维是找比它小的数,那么就可以用树状数组来找 这样就可以降低复杂度 #include<iostream> #include<cstdio> #include<cstring> #include

hdu 1207 汉诺塔II (DP+递推)

汉诺塔II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4529    Accepted Submission(s): 2231 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往

[hdu 2102]bfs+注意INF

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 感觉这个题非常水,结果一直WA,最后发现居然是0x3f3f3f3f不够大导致的--把INF改成INF+INF就过了. #include<bits/stdc++.h> using namespace std; bool vis[2][15][15]; char s[2][15][15]; const int INF=0x3f3f3f3f; const int fx[]={0,0,1,-1};

HDU 3555 Bomb (数位DP)

数位dp,主要用来解决统计满足某类特殊关系或有某些特点的区间内的数的个数,它是按位来进行计数统计的,可以保存子状态,速度较快.数位dp做多了后,套路基本上都差不多,关键把要保存的状态给抽象出来,保存下来. 简介: 顾名思义,所谓的数位DP就是按照数字的个,十,百,千--位数进行的DP.数位DP的题目有着非常明显的性质: 询问[l,r]的区间内,有多少的数字满足某个性质 做法根据前缀和的思想,求出[0,l-1]和[0,r]中满足性质的数的个数,然后相减即可. 算法核心: 关于数位DP,貌似写法还是