概述
Description
将一个圆盘分为n个扇形,每个扇形可涂红、黄、蓝三种颜色中的一种,但相邻两个扇形的颜色必须不同,问有多少中涂法。
Input
第一行一个数t表示t组数据,接下来t行每行一个数n表示分成n个扇形。
Output
对于组数据输出一个数表示染色的方案数,结果模12345678。
Sample Input
Sample Output
HINT
数据范围:
30%的数据t<=10,n<=100。
100%的数据t<=10000,n<=10^9
#include<stdio.h>
#include<string.h>
int t,n;
struct Edge
{
int num[3][3];
}a;
int ksj(int x,int y)
{
int ans=0;
while(y)
{
if(y%2)
ans=(ans+x)%12345678;
x=(x+x)%12345678;
y/=2;
}
return ans;
}
Edge play(Edge x,Edge y)
{
Edge idx;
memset(&idx,0,sizeof(idx));
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
for(int k=1;k<=2;k++)
idx.num[i][j]=(idx.num[i][j]+ksj(x.num[i][k],y.num[k][j]))%12345678;
return idx;
}
Edge power(Edge x,int y)
{
if(y==1)
return x;
Edge idx=power(x,y/2);
idx=play(idx,idx);
if(y%2)
idx=play(idx,x);
return idx;
}
int main()
{
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
scanf("%d",&n);
if(n==1)
{
printf("3n");
continue;
}
if(n==2)
{
printf("6n");
continue;
}
if(n==3)
{
printf("6n");
continue;
}
a.num[1][1]=1;
a.num[1][2]=2;
a.num[2][1]=1;
Edge idx=power(a,n-3);
printf("%dn",(ksj(6,idx.num[1][1])+ksj(6,idx.num[1][2]))%12345678);
}
}
最后
以上就是受伤烧鹅为你收集整理的圆盘染色(大数据)的全部内容,希望文章能够帮你解决圆盘染色(大数据)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复