[CSP-S模拟测试]:山洞(DP+快速幂)
题目传送门(内部题17)
输入格式
一行两个整数$n$,$m$,含义如题面。
输出格式
一行一个整数,表示方案数模$1e9+7$。
样例
样例输入1:
4 6
样例输出1:
0
样例输入2:
707 185547
样例输出2:
588828156
数据范围与提示
对于$20\%$的数据,$m\leqslant 20$。
对于$60\%$的数据,$m\leqslant 1,000$。
对于$100\%$的数据,$m\leqslant 1e9,n\leqslant 1,000$。
题解
这道题原题题意有误,我在上面已经做了修改。
$40\%$算法:
直接输出$0$就好啦,我也很震惊居然有这么多分~
时间复杂度:$\Theta(1)$。
期望得分:$0$分。
实际得分:$40$分。
$60\%$算法:
设$dp[i][j]$表示在第$i$步到$j$的方案数,那么很轻松的就能列出状态转移方程:$dp[i][j]=dp[i-1][j-i]+dp[i-1][j+i]$。
时间复杂度:$\Theta(n\times m)$。
期望得分:$60$分。
实际得分:$60$分(结合上面的“算法”可以得到$80$分)。
$100\%$算法:
发现我们可以只预处理出来前$n$步的情况,然后用快速幂处理$\left \lceil \frac{m}{n}\right \rceil$次,后$m\mod n$步再暴力走完,时间复杂度不允许?循环矩阵哇,可以感性的理解为将步数向右推一位。
时间复杂度:$\Theta(n^2\times \log m)$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
long long n,m;
long long dp[1001][1001];
long long wzc[1001],flag[1001],ans[1001];
void matrix1()
{
for(long long i=0;i<n;i++)flag[i]=ans[i],ans[i]=0;
for(long long i=0;i<n;i++)
for(long long j=0;j<n;j++)
ans[(i+j)%n]=(ans[(i+j)%n]+flag[i]*wzc[j]%1000000007)%1000000007;
}
void matrix2()
{
for(long long i=0;i<n;i++)flag[i]=wzc[i],wzc[i]=0;
for(long long i=0;i<n;i++)
for(long long j=0;j<n;j++)
wzc[(i+j)%n]=(wzc[(i+j)%n]+flag[i]*flag[j]%1000000007)%1000000007;
}
int main()
{
scanf("%lld%lld",&n,&m);
dp[0][0]=1;
for(long long i=1;i<=n;i++)
for(long long j=0;j<n;j++)
{
if((j-i+n)%n==(j+i)%n)dp[i][j]=dp[i-1][(j+i)%n];
else dp[i][j]=(dp[i-1][(j-i+n)%n]+dp[i-1][(j+i)%n])%1000000007;
}
for(long long i=0;i<n;i++)
wzc[i]=dp[n][i];
ans[0]=1;
long long bs=m/n;
while(bs)
{
if(bs&1)matrix1();
matrix2();
bs>>=1;
}
bs=m%n;
for(long long i=0;i<n;i++)
dp[0][i]=ans[i];
for(long long i=1;i<=bs;i++)
for(long long j=0;j<n;j++)
{
if((j-i+n)%n==(j+i)%n)dp[i][j]=dp[i-1][(j+i)%n];
else dp[i][j]=(dp[i-1][(j-i+n)%n]+dp[i-1][(j+i)%n])%1000000007;
}
printf("%lld",dp[bs][0]);
return 0;
}
rp++
[CSP-S模拟测试]:山洞(DP+快速幂)的更多相关文章
- [CSP-S模拟测试]:随(快速幂+数学)
题目描述 给出$n$个正整数$a_1,a_2...a_n$和一个质数mod.一个变量$x$初始为$1$.进行$m$次操作.每次在$n$个数中随机选一个$a_i$,然后$x=x\times a_i$.问 ...
- 【bzoj4870】[Shoi2017]组合数问题 dp+快速幂/矩阵乘法
题目描述 输入 第一行有四个整数 n, p, k, r,所有整数含义见问题描述. 1 ≤ n ≤ 10^9, 0 ≤ r < k ≤ 50, 2 ≤ p ≤ 2^30 − 1 输出 一行一个整数 ...
- 【11.1校内测试】【快速幂DP】【带权并查集】【模拟】
Solution $jzy$大佬用了给的原根的信息,加上矩阵快速幂150行QAQ 然而$yuli$大佬的做法不仅好懂,代码只有50行! 快速幂的思想,把m看成要组成的区间总长度,每次将两段组合得到新的 ...
- 2018.10.19 NOIP模拟 硬币(矩阵快速幂优化dp)
传送门 不得不说神仙出题人DZYODZYODZYO出的题是真的妙. f[i][j][k]f[i][j][k]f[i][j][k]表示选的硬币最大面值为iii最小面值不小于jjj,总面值为kkk时的选法 ...
- BZOJ.4818.[SDOI2017]序列计数(DP 快速幂)
BZOJ 洛谷 竟然水过了一道SDOI!(虽然就是很水...) 首先暴力DP,\(f[i][j][0/1]\)表示当前是第\(i\)个数,所有数的和模\(P\)为\(j\),有没有出现过质数的方案数. ...
- poj 3744 概率dp 快速幂 注意排序 难度:2
/* Scout YYF I Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5304 Accepted: 1455 De ...
- 2018.08.30 NOIP模拟 kfib(矩阵快速幂+exgcd)
[输入] 一行两个整数 n P [输出] 从小到大输出可能的 k,若不存在,输出 None [样例输入 1] 5 5 [样例输出] 2 [样例解释] f[0] = 2 f[1] = 2 f[2] = ...
- BZOJ3209 花神的数论题 【组合数学+数位DP+快速幂】*
BZOJ3209 花神的数论题 Description 背景 众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦. 描述 话说花神这天又来讲课了.课后照例有 ...
- Codeforces 935 简单几何求圆心 DP快速幂求与逆元
A #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #def ...
随机推荐
- vue- 指令v-if 与指令v-show的区别
区别1: v-if :可以根据表达式的值在DOM中生成或移除一个元素. v-show:可以根据表达式的值来显示或者隐藏HTML元素.当v-show赋值为false时,元素被隐藏,此时查看代码时,该元素 ...
- 使用rdb文件进行redis数据迁移--python脚本
查找了一些redis迁移的方法,一般做法就是 1. 从源数据库把rdb文件保存,然后传到新的主机上,启动新的redis即可 2. 把新的redis当做源数据库的slave,同步数据 今天开发提了一个测 ...
- 【ABAP系列】SAP ABAP与Java数据类型的对应关系
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP与Java数据类 ...
- Bootstrap,Bagging and Random Forest Algorithm
Bootstrap Method:在统计学中,Bootstrap从原始数据中抽取子集,然后分别求取各个子集的统计特征,最终将统计特征合并.例如求取某国人民的平均身高,不可能测量每一个人的身高,但却可以 ...
- 在Linux下将HTML文件转换成PDF文件
今天要写一个上交的作业,本来是想用Office Word来写的,但是,我的Office貌似不能用了,但是,Linux下的LibreOffice写出的文档,在打印的时候是经常出现乱码的.所以,后来想到可 ...
- Uncaught TypeError: Cannot set property onclick' of null
如果出现以上问题,只需要把<script src="xxx.js"></script> 移动到最后,</body>的前面;
- 洛谷 P1589 泥泞路 & 2019青岛市竞赛(贪心)
题目链接 https://www.luogu.org/problemnew/show/P1589 解题思路 用结构体存下每一段泥泞路的左端点和右端点,然后用sort根据左端点排序,采用贪心的思想,从左 ...
- [BZOJ 3307]Cow Politics (LCA)
[BZOJ 3307]Cow Politics (LCA) 题面 给出一棵N个点的树,树上每个节点都有颜色.对于每种颜色,求该颜色距离最远的两个点之间的距离.N≤200000 分析 显然对于每种颜色建 ...
- Codeforces 1172B(组合数学)
题面 给出一棵n个点的树,要求把它画在圆上,且边不相交,画法与排列一一对应(即旋转后相同的算不同种),求方案数.如下图是4个点的树\(T:V=\{1,2,3,4\},E=\{(1,2),(1,3),( ...
- vmware linux root密码破解
centOS: 1.开机过程按上下箭头键,让系统不要进入到引导程序中, 2.按 'e' 进入到编辑模式 3.找到linux16开始的首行,在末尾加入'rw init=/bin/sh' (会出现修改密码 ...