OpenJ_POJ 1058 Guideposts
Problem
Solution
如果我们用 \(G\) 来表示邻接矩阵,那么答案其实就是求\(\sum_{k|i}^n \binom n i G^i\)
为了消除整除的限制,我们可以考虑单位根反演:
\]
那么原题就是要求
\]
\]
\]
注意到题目的一个限制\(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的更多相关文章
- NYOJ之题目1058部分和问题
---------------------------------------- 简单搜索+剪枝 因为考虑到可能会有多个解,所以是将中间过程保存最后才一起打印出来的 AC代码: 1: 2: impor ...
- HDU 1058 Humble Numbers(离线打表)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1058 解题报告:输入一个n,输出第n个质因子只有2,3,5,7的数. 用了离线打表,因为n最大只有58 ...
- ytu 1058: 三角形面积(带参的宏 练习)
1058: 三角形面积 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 190 Solved: 128[Submit][Status][Web Boar ...
- NYOJ 1058 部分和问题
部分和问题 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 给定整数a1.a2........an,判断是否可以从中选出若干数,使它们的和恰好为K. 输入 首先, ...
- 1058 N的阶乘的长度
1058 N的阶乘的长度 基准时间限制:1 秒 空间限制:131072 KB 输入N求N的阶乘的10进制表示的长度.例如6! = 720,长度为3. Input 输入N(1 <= N <= ...
- bzoj 1058 [ZJOI2007]报表统计(set)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1058 [题意] 一个序列,提供插入,查询相邻最小差值,查询任意最小差值的操作. [思路 ...
- [BZOJ 1058] [ZJOI2007] 报表统计 【平衡树】
题目链接:BZOJ - 1058 题目分析 这道题看似是需要在序列中插入一些数字,但其实询问的内容只与相邻的元素有关. 那么我们只要对每个位置维护两个数 Ai, Bi, Ai 就是初始序列中 i 这个 ...
- BZOJ 1058: [ZJOI2007]报表统计( 链表 + set )
这种题用数据结构怎么写都能AC吧...按1~N弄个链表然后每次插入时就更新答案, 用set维护就可以了... --------------------------------------------- ...
- Light OJ - 1058 Parallelogram Counting(判定平行四边形)
Description There are n distinct points in the plane, given by their integer coordinates. Find the n ...
随机推荐
- Vue里边接口访问Post、Get
原文地址: http://www.cnblogs.com/JimmyBright/p/7356502.html 通常js里面都用ajax来和服务器交换数据,Vue里边当然也可以用ajax,ajax是基 ...
- 学习Spring Boot:(四)应用日志
前言 应用日志是一个系统非常重要的一部分,后来不管是开发还是线上,日志都起到至关重要的作用.这次使用的是 Logback 日志框架. 正文 Spring Boot在所有内部日志中使用Commons L ...
- 学习Spring Boot:(三)配置文件
前言 Spring Boot使用习惯优于配置(项目中存在大量的配置,此外还内置了一个习惯性的配置,让你无需手动进行配置)的理念让你的项目快速运行起来. 正文 使用配置文件注入属性 Spring Boo ...
- 51nod 1766 树上的最远点对 | LCA ST表 线段树 树的直径
51nod 1766 树上的最远点对 | LCA ST表 线段树 树的直径 题面 n个点被n-1条边连接成了一颗树,给出a~b和c~d两个区间,表示点的标号请你求出两个区间内各选一点之间的最大距离,即 ...
- Alpha 冲刺 —— 十分之三
队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 协助后端界面的开发 搭建项目运行的服务器环境 ...
- 洛谷 P1783 海滩防御 解题报告
P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...
- 中行P1签名及验签
分享中国银行快捷.NET P1签名和验签方法代码中ReturnValue为自定义类型请无视 #region 验证签名 /// <summary> /// 验证签名 /// </sum ...
- 解题:HEOI 2013 SAO
题面 不好讲,直接上式子吧=.= 设$dp[i][j]$表示考虑完$i$的子树后$i$的排名为$j$的方案数,然后转移类似树形背包,具体来说是(这里假设子树在$i$后选,其实反过来还用这个式子答案也是 ...
- 解题:USACO18FEB Taming the Herd
题面 从零开始的DP学习系列之贰(我的DP真的就这么烂TAT) 设DP状态的另一个技巧,考虑题目中有关答案的各种信息 然后这种和结尾有关系的$dp$可以考虑向前找结尾来转移 设$dp[i][j]$表示 ...
- YBT 6 数学基础
$补+写题ing$ 第 1 章 快速幂 序列的第 k 个数 link $solution:$ 板子 A 的 B 次方 link $solution:$ 板子 [NOIP2013] 转圈游戏 link ...