Problem

OpenJ_POJ

Solution

如果我们用 \(G\) 来表示邻接矩阵,那么答案其实就是求\(\sum_{k|i}^n \binom n i G^i\)

为了消除整除的限制,我们可以考虑单位根反演:

\[\frac 1 k\sum_{i=0}^{k-1}w_k^{in}=[k|n]
\]

那么原题就是要求

\[\frac 1 k\sum_{i=0}^n \binom n i G^i\sum_{j=0}^{k-1}w_k^{ij}
\]

\[\frac 1 k\sum_{j=0}^{k-1}\sum_{i=0}^n \binom n i (Gw_k^j)^i
\]

\[\frac 1 k\sum_{j=0}^{k-1}(Gw_k^j+1)^n
\]

注意到题目的一个限制\(P\equiv 1 \pmod k\),此时有\(w_k=g^{\frac {p-1} {k}}\)。为什么呢?因为\(w_k^k=1=g^{p-1}\),而且显然根据原根的性质,\(\forall_{i<k} w_k^i\)都两两不相等。

时间复杂度\(O(km^3\log n)\)

Code

#include <cstring>
#include <cstdio>
using namespace std;
typedef long long ll;
template <typename Tp> inline int getmin(Tp &x,Tp y){return y<x?x=y,1:0;}
template <typename Tp> inline int getmax(Tp &x,Tp y){return y>x?x=y,1:0;}
template <typename Tp> inline void read(Tp &x)
{
x=0;int f=0;char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') f=1,ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
if(f) x=-x;
}
int m,k,l,s,t,cnt,mod,G,wk,ans,pri[40];
ll n;
int pls(int x,int y){return x+y>=mod?x+y-mod:x+y;}
int dec(int x,int y){return x-y<0?x-y+mod:x-y;}
struct Matrix{
int a[5][5];
Matrix(){memset(a,0,sizeof(a));}
int* operator [] (int x){return a[x];}
void clear(){memset(a,0,sizeof(a));}
Matrix operator * (Matrix &b)const
{
Matrix res;
for(int i=0;i<5;i++)
for(int k=0;k<5;k++)
for(int j=0;j<5;j++)
res[i][j]=pls(res[i][j],(ll)a[i][k]*b[k][j]%mod);
return res;
}
Matrix operator + (Matrix b)const
{
Matrix res;
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
res[i][j]=pls(a[i][j],b[i][j]);
return res;
}
Matrix operator * (const int &b)const
{
Matrix res;
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
res[i][j]=(ll)a[i][j]*b%mod;
return res;
}
}A,B,C,E;
int power(int x,int y)
{
int res=1;
for(;y;y>>=1,x=(ll)x*x%mod)
if(y&1ll)
res=(ll)res*x%mod;
return res;
}
Matrix mat_pow(Matrix x,ll y)
{
Matrix res=x;
for(--y;y;y>>=1,x=x*x)
if(y&1)
res=res*x;
return res;
}
void find_G()
{
int x=mod-1,f;
for(int i=2;i*i<=x;i++)
if(x%i==0)
{
pri[++cnt]=i;
while(x%i==0) x/=i;
}
if(x>1) pri[++cnt]=x;
for(G=2;;G++)
{
f=1;
for(int j=1;j<=cnt;j++)
if(power(G,(mod-1)/pri[j])==1)
{f=0;break;}
if(f) return ;
}
}
int input()
{
int u,v;
if(scanf("%d",&m)==EOF) return 0;
cnt=0;A.clear();B.clear();C.clear();
read(n);read(k);read(mod);
read(l);read(s);read(t);--s;--t;
for(int i=1;i<=l;i++)
{
read(u);read(v);
++C[v-1][u-1];
}
for(int i=0;i<5;i++) E[i][i]=1;
find_G();B[s][0]=1;
return 1;
}
int main()
{
while(input())
{
wk=power(G,(mod-1)/k);
for(int i=0;i<k;i++,C=C*wk)
A=A+mat_pow(C+E,n);
A=A*B;
ans=(ll)A[t][0]*power(k,mod-2)%mod;
printf("%d\n",ans);
}
return 0;
}

OpenJ_POJ 1058 Guideposts的更多相关文章

  1. NYOJ之题目1058部分和问题

    ---------------------------------------- 简单搜索+剪枝 因为考虑到可能会有多个解,所以是将中间过程保存最后才一起打印出来的 AC代码: 1: 2: impor ...

  2. HDU 1058 Humble Numbers(离线打表)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1058 解题报告:输入一个n,输出第n个质因子只有2,3,5,7的数. 用了离线打表,因为n最大只有58 ...

  3. ytu 1058: 三角形面积(带参的宏 练习)

    1058: 三角形面积 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 190  Solved: 128[Submit][Status][Web Boar ...

  4. NYOJ 1058 部分和问题

    部分和问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 给定整数a1.a2........an,判断是否可以从中选出若干数,使它们的和恰好为K.   输入 首先, ...

  5. 1058 N的阶乘的长度

    1058 N的阶乘的长度 基准时间限制:1 秒 空间限制:131072 KB 输入N求N的阶乘的10进制表示的长度.例如6! = 720,长度为3. Input 输入N(1 <= N <= ...

  6. bzoj 1058 [ZJOI2007]报表统计(set)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1058 [题意] 一个序列,提供插入,查询相邻最小差值,查询任意最小差值的操作. [思路 ...

  7. [BZOJ 1058] [ZJOI2007] 报表统计 【平衡树】

    题目链接:BZOJ - 1058 题目分析 这道题看似是需要在序列中插入一些数字,但其实询问的内容只与相邻的元素有关. 那么我们只要对每个位置维护两个数 Ai, Bi, Ai 就是初始序列中 i 这个 ...

  8. BZOJ 1058: [ZJOI2007]报表统计( 链表 + set )

    这种题用数据结构怎么写都能AC吧...按1~N弄个链表然后每次插入时就更新答案, 用set维护就可以了... --------------------------------------------- ...

  9. Light OJ - 1058 Parallelogram Counting(判定平行四边形)

    Description There are n distinct points in the plane, given by their integer coordinates. Find the n ...

随机推荐

  1. c++11 模板的别名

    c++11 模板的别名 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #inclu ...

  2. Vue设置不同的环境发布程序

    原文地址: http://www.cnblogs.com/JimmyBright/p/7307486.html 通常应用程序上线都会经过开发环境.测试环境.生产环境三个阶段,三个环境通常会对应有三个不 ...

  3. PHP中文字符gbk编码与UTF-8编码的转换

    通常PHP中上传文件,如果文件名称有中文字符,上传之后的名称是无法写入到本地的,因为上传来的编码格式一般是UTF-8的格式,这种格式是无法给文件命名并且存储到操作系统磁盘.在写入之前需要将其转换为gb ...

  4. 【BZOJ2423】最长公共子序列(动态规划)

    [BZOJ2423]最长公共子序列(动态规划) 题面 BZOJ 洛谷 题解 今天考试的时候,神仙出题人\(fdf\)把这道题目作为一个二合一出了出来,我除了orz还是只会orz. 对于如何\(O(n^ ...

  5. 【洛谷P4706】取石子

    Description ​ 现在 Yopilla 和 yww 要开始玩游戏! ​ 他们在一条直线上标记了 \(n\) 个点,从左往右依次标号为 \(1, 2, ..., n\) .然后在每个点上放置一 ...

  6. Active Directory PowerShell模块收集AD信息

    0x00 前言简介 Microsoft为Windows Server 2008 R2(以及更高版本)提供了多个Active Directory PowerShell cmdlet,这大大简化了以前需要 ...

  7. 解题:USACO12FEB Nearby Cows

    题面 比较简单的树形dp(递推?) 设$dp[i][j]$表示距离$i$距离为$j$的点的数目,先预处理$g[i][j]$表示点$i$的子树中距离这个点距离为$j$的点的数目(猫老师讲过,用一个栈维护 ...

  8. EL与OGNL以及值栈的理解

    这里先添加下在项目遇到的问题: 这两天在做论坛项目的时候,犯了一个错误:将数据放入值栈中,结果jsp页面获取不到. 困扰了许久: 总结如下: (1)每个action对应相应页面的值栈中值的获取,在属于 ...

  9. Python【zip-map-filter】三个内置函数

    print("============内置函数:zip===========")l2 = ['a','b','c','e','f','g']l3 = [1,2,3]L4=['A', ...

  10. html5 +css3 点击后水波纹扩散效果 兼容移动端

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...