题目传送门(内部题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. imx8移植opencv(3.0以上版本)笔记

    基本步骤参考我同事的博客:https://blog.csdn.net/hunzhangzui9837/article/details/89846928 以下是在移植到imx8平台时的笔记和遇到的问题及 ...

  2. 二、maven学习

    maven工程运行环境修改 例如maven自带Tomcat6,我们想使用Tomcat7 pom.xml #配置多一个Tomcat7<plugins> <plugin> < ...

  3. O064、NFS Volume Provider(Part III)

    参考https://www.cnblogs.com/CloudMan6/p/5702199.html   今天我们将前一小节中创建的 nfs-vol-xx attach 到Instance c1 上, ...

  4. Intellij Idea 建立maven项目 报错 :java: 错误: 不支持发行版本 5

    百度一搜这个错误,好多人都遇到了 不计其数的人都遇到.网上大多数都是菜鸟的愚见.经过本人的测试发现,用Idea建立普通的Java项目 然后随便建立一个类运行就不会报错. 但是如果用Idea建立一个普通 ...

  5. mysql 批量 insert 数据丢失问题

    这两天发现mysql 批量insert 比如600条数据后,页面马上select就查询到580条,但是等几秒钟再查询就有600条(也有部分情况是永久只能查到580条了) 查看mybatis的日志发现循 ...

  6. Windows 下的快捷键

    电脑快捷键小技巧window健 + r   →  msconfig       查看电脑的开机启动项window健 + r   →  notepad        无标题的记事本window健 + r ...

  7. Troubleshooting: Cannot Run on an Android Device

    同事在他的开发环境中,在IDE中直接在手机上运行Android项目,结果出现这个错误,无法在手机上安装. 产生这个问题的原因,一般就是签名不对,这种情况,删除手机上装过的同名应用,就可以解决.当然,你 ...

  8. shell基本概念

    一.shell分类 常见shell:bash.zsh.tcsh linux默认:bash shell #tcsh #bash #pstree | grep login |- .. .. |-login ...

  9. CentOS 安装 elasticsearch 注意点

    注意点: 1. 从官网下载以 rpm 结尾的软件包 7.3.1版本 下载地址: https://artifacts.elastic.co/downloads/elasticsearch/elastic ...

  10. 查看TensorFlow的版本以及安装路径

    查看TensorFlow的版本以及安装路径 进入到Python环境 import tensorflow as tf tf.__version__ # 查看版本 tf.__path__ # 查看安装路径 ...