Palindrome graph
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 96 Accepted Submission(s): 38
Problem Description
In addition fond of programing, Jack also loves painting. He likes to draw many interesting graphics on the paper.
One day,Jack found a new interesting graph called Palindrome graph. No matter how many times to flip or rotate 90 degrees, the palindrome graph are always unchanged.
Jack took a paper with n*n grid and K kinds of pigments.Some of the grid has been filled with color and can not be modified.Jack want to know:how many ways can he paint a palindrome graph?
One day,Jack found a new interesting graph called Palindrome graph. No matter how many times to flip or rotate 90 degrees, the palindrome graph are always unchanged.
Jack took a paper with n*n grid and K kinds of pigments.Some of the grid has been filled with color and can not be modified.Jack want to know:how many ways can he paint a palindrome graph?
Input
There are several test cases.
For each test case,there are three integer n m k(0<n<=10000,0<=m<=2000,0<k<=1000000), indicate n*n grid and k kinds of pigments.
Then follow m lines,for each line,there are 2 integer i,j.indicated that grid(i,j) (0<=i,j<n) has been filled with color.
You can suppose that jack have at least one way to paint a palindrome graph.
For each test case,there are three integer n m k(0<n<=10000,0<=m<=2000,0<k<=1000000), indicate n*n grid and k kinds of pigments.
Then follow m lines,for each line,there are 2 integer i,j.indicated that grid(i,j) (0<=i,j<n) has been filled with color.
You can suppose that jack have at least one way to paint a palindrome graph.
Output
For each case,print a integer in a line,indicate the number of ways jack can paint. The result can be very large, so print the result modulo 100 000 007.
Sample Input
3 0 2 4 2 3 1 1 3 1
Sample Output
8 3
Source
Recommend
zhuyuanchen520
虽然说是水题,还是记录下。
#include<iostream>
#include<cstdlib>
#include<stdio.h>
#include<algorithm>
#define ll __int64
using namespace std;
const ll mm=100000007;
ll a[10010];
int flag[2010];
int uu,n;
struct Node
{
int xx,yy,id;
}node[2000000];
int cmp(Node aa,Node bb)
{
if(aa.xx==bb.xx) return aa.yy<bb.yy;
return aa.xx<bb.xx;
}
void init()
{
a[1]=1;a[2]=1;
for(int i=3;i<=10000;i++)
a[i]=a[i-2]+(i+1)/2;
}
ll powermod(ll x,ll y)
{
ll res=1;
while(y)
{
if(y&1) res=(res*x)%mm;
y>>=1;
x=(x*x)%mm;
}
return res;
}
int find(int x)
{
if(flag[x]!=x) flag[x]=find(flag[x]);
return flag[x];
}
void solve(int pi,int pj,int i)
{
if(pi>=1&&pi<=n&&pj>=1&&pj<=n)
{
node[uu].xx=pi;node[uu].yy=pj;node[uu].id=i;uu++;
}
}
int main()
{
int m,k;
init();
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
if(m==0)
{
ll res=powermod(k,a[n]);
printf("%I64d\n",res);
continue;
}
for(int i=0;i<m;i++)
{
scanf("%d%d",&node[i].xx,&node[i].yy);
node[i].xx++;
node[i].yy++;
node[i].id=i;
flag[i]=i;
}
uu=m;
for(int i=0;i<m;i++)
{
int pi,pj;
pi=node[i].yy;pj=node[i].xx;
solve(pi,pj,i);
pi=n-node[i].yy+1;pj=node[i].xx;
solve(pi,pj,i);
pi=node[i].xx;pj=n-node[i].yy+1;
solve(pi,pj,i);
pi=node[i].yy;pj=n-node[i].xx+1;
solve(pi,pj,i);
pi=n-node[i].yy+1;pj=n-node[i].xx+1;
solve(pi,pj,i);
pi=n-node[i].xx+1;pj=node[i].yy;
solve(pi,pj,i);
pi=n-node[i].xx+1;pj=n-node[i].yy+1;
solve(pi,pj,i);
}
sort(node,node+uu,cmp);
for(int i=1;i<uu;i++)
{
if(node[i].xx==node[i-1].xx&&node[i].yy==node[i-1].yy)
{
flag[find(node[i].id)]=find(node[i-1].id);
}
}
int count=0;
for(int i=0;i<m;i++)
{
if(find(i)==i) count++;
}
int bb=a[n]-count;
ll res=powermod(k,bb);
printf("%I64d\n",res);
}
}
本文深入探讨了Palindromegraph的特性,并通过实例展示了如何使用编程技巧来绘制这类图形。文章详细阐述了输入数据处理、算法设计以及优化策略,旨在提供一种高效且直观的方法来解决绘制Palindromegraph的问题。此外,通过实例演示了如何利用有限状态机等概念简化问题,最终得出了一种实用的解决方案。

1万+

被折叠的 条评论
为什么被折叠?



