Birthday Toy

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 644    Accepted Submission(s): 326

Problem Description
AekdyCoin loves toys. It is AekdyCoin’s Birthday today and he gets a special “Toy”.
The “Toy” is in bulk and AekdyCoin has to make one by him. Let’s assume that the “Toy” has N small white beads and one Big bead .If someone want to make a “Toy”, he (or she) must always puts the Big bead in center, and then connect the other N small beads around it by using N sticks with equal length, and then the N small beads must be connected by N sticks with equal length, and it could be seen as a regular polygon. Figure 1 shows a “Toy” with 8 small white beads and one big white bead.

Now AekdyCoin has C kinds of available color, say blue, green, yellow, pink …etc. He wants to color these beads, but he thinks that must be too boring and stupid. So he colors these beads with one role: any adjacent beads couldn’t have same color. Figure 2 shows a legal situation, and Figure 3 shows an illegal situation.


It seems that the “Toy” becomes more interesting for AekdyCoin right now; however, he wants to color the big bead in center. Of course, he should follow the role above.

Now AekdyCoin begins to play with the “Toy”, he always colors the big beads and then the other small beads. He should color under the rule above. After several minutes, AekdyCoin finally makes a perfect “Toy”. Figure 4 shows a situation that is under the color rule.

AekdyCoin now want to know the different method to color the “Toy” whit at most K color. (“Toy” contains N small beads and one big bead.)
But, no, the problem is not so easy .The repetitions that are produced by rotation around the center of the circular necklace are all neglected. Figure 5 shows 8 “Toy”, they are regard as one method.


Now AekdyCoin will give you N and K, he wants you to help him calculate the number of different methods, because the number of method is so huge, so AekdyCoin just want you to tell him the remainder when divided by M.
In this problem, M = 1,000,000,007.

 
Input
The input consists of several test cases.(at least 1000)
Every case has only two integers indicating N, K 
(3<=N<=10^9, 4<=K<=10^9)
 
Output
For each case, you should output a single line indicates the remainder of number of different methods after divided by M.
 
Sample Input
3 4
3 5
3 17
162 78923
 
Sample Output
8
40
19040
19469065
 
/*
hdu 2865 Polya计数+(矩阵 or 找规律 求C) 给你n个小球全部连在一个大球上然后对他们进行染色,要求相连的球颜色不一样
首先确定大球为一种颜色(k种可能)。然后用剩下k-1种用Polya去处理小球即可 在计算循环节长度为i的可能数时由于k很大,矩阵快速幂很明显不行诶
1.可以考虑递推,假设第一个颜色是x,用f[i][1]表示当前颜色是x,f[i][0]表示当前颜色非x。
f[i][1] = f[i-1][0]
f[i][0] = (k-2)*f[i-1][0]+(k-1)*f[i-1][1] 2.假设用3种颜色染循环节长度为len小球,构建出来的矩阵是
0 1 1 2 1 1 2 3 3 6 5 5 10 11 11
1 0 1 -> 1 2 1 -> 3 2 3 -> 5 6 5 -> 11 10 11
1 1 0 1 1 2 3 3 2 5 5 6 11 11 10
——参考自cxlove大神.
可以发现是有规律的:(2 = 3-1)
n = 1 -> 0 (2^n - 2)
n = 2 -> 6 (2^n + 2)
n = 3 -> 6 (2^n - 2)
n = 4 -> 18 (2^n + 2)
n = 5 -> 30 (2^n - 2)
代码为注释部分 hhh-2016-04-22 10:12:35
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <functional>
using namespace std;
#define lson (i<<1)
#define rson ((i<<1)|1)
typedef long long ll;
using namespace std;
const ll mod = 1e9 + 7;
const int maxn = 40010; int num;
int prime[maxn];
int isPrime[maxn]; void get_prime()
{
num = 0;
memset(isPrime,0,sizeof(isPrime));
for(int i = 2; i <= maxn-10; i++)
{
if(!isPrime[i])
{
prime[num++] = i;
for(int j = i+i; j <= maxn-10; j+=i)
isPrime[j] = 1;
}
}
} ll euler(ll cur)
{
ll ans = cur;
ll x = cur;
for(int i = 0; i < num && prime[i]*prime[i] <= cur; i++)
{
if(x % prime[i] == 0)
{
ans = ans/prime[i]*(prime[i]-1);
while(x % prime[i] == 0)
x /= prime[i];
}
}
if(x > 1)
{
ans = ans/x*(x-1);
}
return ans%mod;
} ll pow_mod(ll a,ll n)
{
ll ret = 1;
a %= mod;
while(n)
{
if(n & 1) ret = ret*a%mod;
a = a*a%mod;
n >>= 1;
}
return ret%mod;
} /*
another:
ll solve(ll p,ll k)
{
ll ans=pow_mod(p-1,k);
if(k&1)
ans=(ans+mod-(p-1))%mod;
else
ans=(ans+p-1)%mod;
return ans;
}
*/ struct Matrix
{
ll ma[3][3];
Matrix()
{
memset(ma,0,sizeof(ma));
}
}; Matrix mult(Matrix ta,Matrix tb)
{
Matrix tc;
for(int i = 0 ; i < 2; i ++)
{
for(int j = 0; j < 2; j++)
{
for(int k = 0; k < 2; k++)
tc.ma[i][j] = (tc.ma[i][j] + ta.ma[i][k]*tb.ma[k][j]%mod)%mod;
}
}
return tc;
} Matrix Mat_mod(Matrix a,int n)
{
Matrix cnt;
for(int i = 0; i < 2; i++)
cnt.ma[i][i] = 1;
while(n)
{
if(n & 1 ) cnt = mult(cnt,a);
a = mult(a,a);
n >>= 1;
}
return cnt;
} Matrix mat;
Matrix begi; ll solve(ll p,ll k)
{
begi.ma[0][1] = 1,begi.ma[0][0] = 0,begi.ma[1][0] = 0,begi.ma[1][1] = 0;
mat.ma[0][0] = p - 2, mat.ma[1][0] = p - 1, mat.ma[0][1] = 1, mat.ma[1][1] = 0;
mat = Mat_mod(mat,k-1);
Matrix tp = mult(begi,mat);
return p*tp.ma[0][0]%mod;
} ll cal(ll n,ll k)
{
ll ans = 0;
for(int i = 1; i*i <= n; i++)
{
if(n % i == 0)
{
ans = (ans + solve(k,n/i)*euler(i)%mod)%mod;
if(n != i*i)
ans = (ans + solve(k,i)*euler(n/i)%mod)%mod;
}
}
return (ans*pow_mod(n,mod-2))%mod;
} ll N,k; int main()
{
get_prime();
while(scanf("%I64d%I64d",&N,&k) != EOF)
{
printf("%I64d\n",k*cal(N,k-1)%mod);
}
return 0;
}

  

hdu 2865 Polya计数+(矩阵 or 找规律 求C)的更多相关文章

  1. hdu 5868 Polya计数

    Different Circle Permutation Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 262144/262144 K ...

  2. 【poj 3090】Visible Lattice Points(数论--欧拉函数 找规律求前缀和)

    题意:问从(0,0)到(x,y)(0≤x, y≤N)的线段没有与其他整数点相交的点数. 解法:只有 gcd(x,y)=1 时才满足条件,问 N 以前所有的合法点的和,就发现和上一题-- [poj 24 ...

  3. 2018年东北农业大学春季校赛 B wyh的矩阵【找规律】

    链接:https://www.nowcoder.com/acm/contest/93/B来源:牛客网 题目描述 给你一个n*n矩阵,按照顺序填入1到n*n的数,例如n=5,该矩阵如下 1 2 3 4 ...

  4. HDU 4388 Stone Game II 博弈论 找规律

    http://acm.hdu.edu.cn/showproblem.php?pid=4388 http://blog.csdn.net/y1196645376/article/details/5214 ...

  5. HDU 4349 Xiao Ming's Hope 找规律

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4349 Xiao Ming's Hope Time Limit: 2000/1000 MS (Java/ ...

  6. HDU 4731 Minimum palindrome 打表找规律

    http://acm.hdu.edu.cn/showproblem.php?pid=4731 就做了两道...也就这题还能发博客了...虽然也是水题 先暴力DFS打表找规律...发现4个一组循环节.. ...

  7. HDU 4588 Count The Carries(找规律,模拟)

    题目 大意: 求二进制的a加到b的进位数. 思路: 列出前几个2进制,找规律模拟. #include <stdio.h> #include <iostream> #includ ...

  8. HDU 3032 (SG打表找规律)

    题意: 有n堆石子,alice先取,每次可以选择拿走一堆石子中的1~x(该堆石子总数) ,也可以选择将这堆石子分成任意的两堆.alice与bob轮流取,取走最后一个石子的人胜利. 思路: 因为数的范围 ...

  9. 2017ACM暑期多校联合训练 - Team 1 1011 HDU 6043 KazaQ's Socks (找规律)

    题目链接 Problem Description KazaQ wears socks everyday. At the beginning, he has n pairs of socks numbe ...

随机推荐

  1. POST请求的提交

    var http = require("http"); var querystring = require("querystring"); //创建服务器 va ...

  2. python3变量和数据类型

        变量和数据类型 知识点 python 关键字 变量的定义与赋值 input() 函数 字符串的格式化 实验步骤 每一种编程语言都有它们自己的语法规则,就像我们所说的外语. 1. 关键字和标识符 ...

  3. Scrum 冲刺 第三日

    Scrum 冲刺 第三日 目录 要求 项目链接 燃尽图 问题 今日任务 明日计划 成员贡献量 要求 各个成员今日完成的任务(如果完成的任务为开发或测试任务,需给出对应的Github代码签入记录截图:如 ...

  4. mongodb 定时备份

    通过centos 脚步来执行备份操作,使用crontab实现定时功能,并删除指定天数前的备份 具体操作: 1.创建Mongodb数据库备份目录 mkdir -p /home/backup/mongod ...

  5. 深度学习之 mnist 手写数字识别

    深度学习之 mnist 手写数字识别 开始学习深度学习,先来一个手写数字的程序 import numpy as np import os import codecs import torch from ...

  6. istio入门(04)istio的helloworld-部署构建

    参考链接: https://zhuanlan.zhihu.com/p/27512075 安装Istio目前仅支持Kubernetes,在部署Istio之前需要先部署好Kubernetes集群并配置好k ...

  7. Spring Cloud的DataRest(二)

    一.创建工程 1.主程序 2.依赖 3.配置 二.案例开发 1.entity 2.repository 三.案例验证 安装postman4.13,启动应用,执行如下案例验证! 1.create - p ...

  8. Asp.NET Core2.0 项目实战入门视频课程_完整版

    END OR START? 看到这个标题,你开不开心,激不激动呢? 没错,.net core的入门课程已经完毕了.52ABP.School项目从11月19日,第一章视频的试录制,到今天完整版出炉,离不 ...

  9. MYSQL之索引原理与慢查询优化

    一.索引 1.介绍 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的也是最容易出现问题的,还是一些复杂的查询操作,因此对查询语句的优化 ...

  10. lambda匿名函数透析

    lambda匿名函数透析 目录 1       匿名函数的作用... 1 2       匿名函数的格式... 1 3       匿名函数实例代码... 3   1         匿名函数的作用 ...