[CSP-S模拟测试]:B(DP+数学)
题目传送门(内部题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+数学)的更多相关文章
- [CSP-S模拟测试]:装饰(数学)
题目传送门(内部题147) 输入格式 每个测试点第一行一个正整数$T$,表示该测试点内的数据组数. 接下来$T$行,每行三个非负整数$a,b,c$,含义如题目中所示. 输出格式 对每组数据输出一行一个 ...
- [CSP-S模拟测试]:Six(数学)
题目传送门(内部题85) 输入格式 一个正整数$N$. 输出格式 一个数表示答案对$1000000007$取模后的结果 样例 样例输入1: 样例输出1: 样例输入2: 样例输出2: 样例输入3: 样例 ...
- [CSP-S模拟测试]:chess(数学)
题目描述 $dirty$在一个棋盘上放起了棋子. 棋盘规格为$n\times m$,他希望任意一个$n\times n$的区域内都有$C$个棋子.$dirty$很快就放置好了一个满足条件的棋盘方案,但 ...
- [CSP-S模拟测试]:不等式(数学)
题目描述 小$z$热衷于数学.今天数学课的内容是解不等式:$L\leqslant S\times x\leqslant R$.小$z$心想这也太简单了,不禁陷入了深深的思考:假如已知$L,R,S,M$ ...
- [CSP-S模拟测试]:旅行(数学+线段树)
题目传送门(内部题12) 输入格式 第一行,一个整数$n$,代表树的点数.第二行,$n$个整数,第$i$个整数是$B_i$,描述排列$B$.接下来$n−1$行,每行两个整数$u,v$,描述一条树边$( ...
- [CSP-S模拟测试]:A(数学)
题目传送门(内部题44) 输入格式 一行四个整数,分别表示$S,T,a,b$. 输出格式 输出最小步数,数据保证有解. 样例 样例输入: 10 28 4 2 样例输出: 数据范围与提示 样例解释: 先 ...
- [CSP-S模拟测试]:最大值(数学+线段树)
题目背景 $Maxtir$最喜欢最大值. 题目传送门(内部题128) 输入格式 第$1$行输入四个正整数$n,m,q$. 第$2$至$n+1$行中,第$i+1$行输入魔法晶石$i$的三种属性$(x_i ...
- [CSP-S模拟测试]:求和(数学)
题目传送门(内部题107) 输入格式 一行五个正整数$x_1,y_1,x_2,y_2,m$ 输出格式 输出一个整数,为所求的答案对$m$取模后的结果. 样例 样例输入: 2 1 5 3 10007 样 ...
- [CSP-S模拟测试]:数列(数学)
题目传送门(内部题95) 输入格式 第一行三个整数$n,a,b$,第二行$n$个整数$x_1\sim x_n$表示数列. 输出格式 一行一个整数表示答案.无解输出$-1$. 样例 样例输入:2 2 3 ...
- [CSP-S模拟测试]:Walker(数学)
题目传送门(内部题86) 输入格式 第一行$n$接下来$n$行,每行四个浮点数,分别表示变换前的坐标和变换后的坐标 输出格式 第一行浮点数$\theta$以弧度制表示第二行浮点数$scale$第三行两 ...
随机推荐
- vs2010 回车、退格键等不能用
有时候在vs2010中,突然回退键.回车键.方向键就用不了了,百度一堆方法,最后找到按Alt+Enter,就可以用了.
- Google谷歌总部员工家庭活动
每年Google总部都会有针对家庭的两个大活动,其中一个就是万圣节.专门针对员工孩子的.#2019Googleween 今年的Googleween分几个场地,所以每个场地很小.她爸爸只带她去了一个.我 ...
- 1 .net将xml反序列化
public static T XmlToObject<T>(string str) where T : class { using (Stream stream = new Memory ...
- PostgreSQL 初学常用实用命令
常用命令 psql -h ip -p port -U user -d dbName 数据库 \dt(当前数据库所有表) \l(所有数据库) \c(切换数据库) \d 表名(查看表结构) table \ ...
- 使用webpack + momentjs时, 需要注意的问题
注意开发HTML页面charset, 如是不是utf-8, 比如是shift_jis, 一般会在webpack里用插件EncodingPlugin把开发的utf-8格式转码成shift_jis格式 ...
- docker 批量删除含有同样名字的images
docker rmi --force $(docker images | grep doss-api | awk '{print $3}') docker rmi $(docker images | ...
- 单点登录系统SSO实现
前些天被问到单点登录了,而据我当时做的这个模块两年了,现在重新温习并记录下,方便以后快速回忆起来 一.什么是单点登录系统 SSO全称Single Sign On.SSO是用户只需要登录一次就可以访问所 ...
- casperjs 源码
1.首当其冲github 地址: https://github.com/casperjs
- gulp connect.static is not a function
npm install --save serve-static var serveStatic = require('serve-static');
- Hdu 1851 Nim+巴什博弈
写出SG表 发现SG函数规律为Mi%(Li+1) #include<bits/stdc++.h> using namespace std; int main() { int t; cin ...