题目传送门(内部题45)


输入格式

第一行$3$个整数$n,m,P$。
第二行$m$个整数,表示$m$次询问。


输出格式

一行$m$个整数表示答案。


样例

样例输入1:

2 4 4
0 1 2 3

样例输出1:

8 2 4 2

样例输入2:

3 3 2333333
1 38 227

样例输出2:

578724625 893056135 887007020


数据范围与提示

样例1解释:

对于第三组询问,四种方案分别为:

$x_0=1,x_1=2$
$x_0=2,x_1=1$
$x_0=2,x_1=3$
$x_0=3,x_1=2$

数据范围:

对于前$20\%$的数据:$n=2$
对于另$30\%$的数据:$P\leqslant 1,000$
对于另$10\%$的数据:$P$为质数。
对于所有数据:
$1\leqslant n\leqslant 50$
$1\leqslant m\leqslant 1,000$
$2\leqslant P\leqslant {10}^9$
$0\leqslant v_i<P$


题解

首先,我们考虑$DP$,定义$dp[i][j]$表示前$i$个变量乘起来取模后结果为$j$的方案数,转移挺简单的,不再赘述。

但是显然跑不过,考虑优化。

打表找规律发现,如果$gcd(a,P)=gcd(b,P)$那么$dp[i][a]=dp[i][b]$。

具体我也不会证,这不怪我,因为出题人也不会。

这样状态数就减少了不少,转移大同小异,注意乘上$\sigma(x)$($x$的约数个数),最后再除掉即可。

直接算可能会$TLE$,我们可以先预处理出来每两个数乘起来是几,注意用$map$即可。

时间复杂度:$\Theta(n\sigma(P)^2)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
int n,m;
long long P;
int Map[1345][1345];
long long dp[51][1345];
long long que[1345],phi[1345];
map<int,int> s;
long long qpow(long long x,long long y)
{
long long res=1;
while(y)
{
if(y&1)res=res*x%1000000007;
x=x*x%1000000007;
y>>=1;
}
return res;
}
void pre_work()
{
for(int i=1;i*i<=P;i++)
if(!(P%i))
{
que[++que[0]]=i;
if(i*i!=P)que[++que[0]]=P/i;
}
}
long long get_phi(long long x)
{
long long res=x;
for(long long i=2;i*i<=x;i++)
if(!(x%i))
{
res=res/i*(i-1);
while(!(x%i))x/=i;
}
if(x>1)res=res/x*(x-1);
return res;
}
int main()
{
scanf("%d%d%lld",&n,&m,&P);
pre_work();
for(int i=1;i<=que[0];i++)
{
phi[i]=get_phi(P/que[i]);
s[que[i]]=i;
dp[1][i]=phi[i];
}
for(int i=1;i<=que[0];i++)
for(int j=1;j<=que[0];j++)
Map[i][j]=s[__gcd(que[i]*que[j]%P,P)];
for(int i=2;i<=n;i++)
for(int j=1;j<=que[0];j++)
for(int k=1;k<=que[0];k++)
dp[i][Map[j][k]]=(dp[i][Map[j][k]]+dp[i-1][j]*phi[k]%1000000007)%1000000007;
while(m--)
{
long long x;
scanf("%lld",&x);
int gcd=__gcd(P,x);
printf("%lld ",dp[n][s[gcd]]*qpow(phi[s[gcd]],1000000005)%1000000007);
}
return 0;
}

rp++

[CSP-S模拟测试]:B(DP+数学)的更多相关文章

  1. [CSP-S模拟测试]:装饰(数学)

    题目传送门(内部题147) 输入格式 每个测试点第一行一个正整数$T$,表示该测试点内的数据组数. 接下来$T$行,每行三个非负整数$a,b,c$,含义如题目中所示. 输出格式 对每组数据输出一行一个 ...

  2. [CSP-S模拟测试]:Six(数学)

    题目传送门(内部题85) 输入格式 一个正整数$N$. 输出格式 一个数表示答案对$1000000007$取模后的结果 样例 样例输入1: 样例输出1: 样例输入2: 样例输出2: 样例输入3: 样例 ...

  3. [CSP-S模拟测试]:chess(数学)

    题目描述 $dirty$在一个棋盘上放起了棋子. 棋盘规格为$n\times m$,他希望任意一个$n\times n$的区域内都有$C$个棋子.$dirty$很快就放置好了一个满足条件的棋盘方案,但 ...

  4. [CSP-S模拟测试]:不等式(数学)

    题目描述 小$z$热衷于数学.今天数学课的内容是解不等式:$L\leqslant S\times x\leqslant R$.小$z$心想这也太简单了,不禁陷入了深深的思考:假如已知$L,R,S,M$ ...

  5. [CSP-S模拟测试]:旅行(数学+线段树)

    题目传送门(内部题12) 输入格式 第一行,一个整数$n$,代表树的点数.第二行,$n$个整数,第$i$个整数是$B_i$,描述排列$B$.接下来$n−1$行,每行两个整数$u,v$,描述一条树边$( ...

  6. [CSP-S模拟测试]:A(数学)

    题目传送门(内部题44) 输入格式 一行四个整数,分别表示$S,T,a,b$. 输出格式 输出最小步数,数据保证有解. 样例 样例输入: 10 28 4 2 样例输出: 数据范围与提示 样例解释: 先 ...

  7. [CSP-S模拟测试]:最大值(数学+线段树)

    题目背景 $Maxtir$最喜欢最大值. 题目传送门(内部题128) 输入格式 第$1$行输入四个正整数$n,m,q$. 第$2$至$n+1$行中,第$i+1$行输入魔法晶石$i$的三种属性$(x_i ...

  8. [CSP-S模拟测试]:求和(数学)

    题目传送门(内部题107) 输入格式 一行五个正整数$x_1,y_1,x_2,y_2,m$ 输出格式 输出一个整数,为所求的答案对$m$取模后的结果. 样例 样例输入: 2 1 5 3 10007 样 ...

  9. [CSP-S模拟测试]:数列(数学)

    题目传送门(内部题95) 输入格式 第一行三个整数$n,a,b$,第二行$n$个整数$x_1\sim x_n$表示数列. 输出格式 一行一个整数表示答案.无解输出$-1$. 样例 样例输入:2 2 3 ...

  10. [CSP-S模拟测试]:Walker(数学)

    题目传送门(内部题86) 输入格式 第一行$n$接下来$n$行,每行四个浮点数,分别表示变换前的坐标和变换后的坐标 输出格式 第一行浮点数$\theta$以弧度制表示第二行浮点数$scale$第三行两 ...

随机推荐

  1. JS中的SRC

    当应用SRC属性时,首先需要创建一个JS文件.为什么不在此文件中使用<script>标记?您可以直接使用输出语句吗?我会分享我的报告一个答案 JS文件不是HTM文件,因此内部不能有HTML ...

  2. linux安装RabbitMQ yum

      一.RabbitMQ概念RabbitMQ是流行的开源消息队列系统,是AMQP(Advanced Message Queuing Protocol高级消息队列协议)的标准实现,用erlang语言开发 ...

  3. ETL 工具和 BI 工具

    ETL是数据仓库中的非常重要的一环,是承前启后的必要的一步.ETL负责将分布的.异构数据源中的数据如关系数据.平面数据文件等抽取到临时中间层后进行清洗.转换.集成,最后加载到数据仓库或数据集市中,成为 ...

  4. 单点登录系统SSO实现

    前些天被问到单点登录了,而据我当时做的这个模块两年了,现在重新温习并记录下,方便以后快速回忆起来 一.什么是单点登录系统 SSO全称Single Sign On.SSO是用户只需要登录一次就可以访问所 ...

  5. svn+jenkins自动部署

    需求:项目经理想要将原型图修改完后直接发布 前置条件: 已经有了svn服务器,并正常使用 已经有了jenkins服务器,之前搭建的gitlab+jenkins, 如需搭建jenkins,参考 http ...

  6. ZooKeeper--动物管理员

    复杂的软件集群系统从来绕不开高可用.负载均衡等问题,大数据系统更是如此. 高可用:计算机系统的可用性定义为系统保持正常运行时间的百分比,具体手段有自动检测,自动切换,自动恢复等. 负载均衡:主要解决单 ...

  7. 【异常】update更新java.sql.SQLException: Duplicate entry '2019-07-30 00:00:00-110100' for key

    1 详细异常信息 User class threw exception: java.sql.SQLException: Duplicate entry '2019-07-30 00:00:00-110 ...

  8. MyEclipse基本配置及优化【MyEclipse_10.7】

    MyEclipse基本配置 MyEclipse所有的配置都是基于工作空间的,当换了个工作空间,之前的所有配置信息就失效了.(建议每次换工作空间之前就配置好基本信息) 1.修改工作空间编码为UTF-8 ...

  9. sql语句 小记录

    select Name '姓名',Age '年龄',(select LessonName + ',' from Lesson where StudentId=s1.Id FOR XML PATH('' ...

  10. 原创:(一)TCP/IP学习笔记之概述

    端到端论点和命运共享其实不应该在底层,差错控制应该在应用程序附近来实现.这是因为考虑了连接,而不是传输的准确,因为差错可以根据某些算法(通信中的滤波等)来恢复,不过在大面积网络出现问题的时候有必要进行 ...