题目传送门(内部题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++

最新文章

  1. POJ2406Power Strings[KMP 失配函数]
  2. python学习之函数
  3. Javascript的ArrayBuffer从Utf8ArrayToString
  4. 用java程序打印菱形
  5. 【bz2594】水管局长数据加强版
  6. 用户输出表单处理php
  7. javascript实现的手风琴折叠菜单效果
  8. raphael 支持group(简)
  9. ios ALAssetsLibrary简单的使用
  10. 二:熟悉 TCP/IP 协议
  11. thymeleaf : input/select/radio回显
  12. Oracle的问题的解决
  13. PyQt5——基本控件
  14. CMake,win10,64位,简单配置测试
  15. df命令详解
  16. Tower Defense Toolkit 学习
  17. 【代码笔记】iOS-对数组进行排序
  18. 51nod 1021 石子归并
  19. 收集了一些python的文章
  20. BZOJ1101 POI2007 Zap 【莫比乌斯反演】

热门文章

  1. Gogs 安装 - 本地安装,容器安装
  2. 浅谈JSONObject解析JSON数据
  3. jdk (Java Development Kit)
  4. vue手写轮播
  5. BZOJ1672 Cleaning Shifts 清理牛棚
  6. OpenLayers绘制地图,无需外网,内网访问,提高安全性。
  7. go web编程——session管理机制设计与实现
  8. zabbix 微信告警脚本
  9. k3 cloud查看附件提示授予目录NetWorkService读写权限
  10. 获取class的儿子,报错undefined