[bzoj3992][SDOI2015]序列统计

基于51单片机的电压表【0-20V,ADC0832,4051,自动量程】(仿真) 自动换挡式数字电压表就是一个基于单片机的能自动切换量程的数字电压表,其作用是在使用低位的AD转换实现高精度电压测量,可以测量0~20V的电压,并且具有0~0.2V(待测电玉低于0.2V时),0~2V(待测电压低于2V时)和0~20V三个量程自动匹配测量,当待测电压值发生变化时,电压表可以根据输入电压情况自动选择合适的量程进行测量,并且把测量结果显示出来。(2)实现电压表精度测试,最高精度要求0.01V;(1)实现0~20V分3档式电压表; 阅读详情

题目描述

小C有一个集合S,里面的元素都是小于M的非负整数。他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S。
小C用这个生成器生成了许多这样的数列。但是小C有一个问题需要你的帮助:给定整数x,求所有可以生成出的,且满足数列中所有数的乘积mod M的值等于x的不同的数列的有多少个。小C认为,两个数列{Ai}和{Bi}不同,当且仅当至少存在一个整数i,满足Ai≠Bi。另外,小C认为这个问题的答案可能很大,因此他只需要你帮助他求出答案mod 1004535809的值就可以了。
1<=N<=109,3<=M<=8000,M为质数,1<=x<=M-1,输入数据保证集合S中元素不重复。

DP

我们设f[i,j]表示放到第i个数,此时乘积为j。
F[i,j]=∑F[i−1,k]
满足k可以与集合内某数相乘模mo的结果为j。
N太大,但是我们显然可以用矩阵乘法优化。
我们把它化为另一种形式:
F[i+1,j∗k%mo]=∑F[i,j]∗C[k]
其中C[k]=0或1表示k这个数在集合里有没有出现。
这样做有什么用呢?

往FFT方面进军

M是质数,我们就可以找到它的原根r。
根据原根定义,我们可以把每一个m以内的数进行映射对应,我们设
ind[i]=j表示rj≡i(Mod m)
那对于任何多项式A我们令A[i]=A[ind[i]]
DP式变为
F[i+1,(j+k)%(m−1)]=∑F[i,j]∗C[k]
“标准”卷积形式。
因此我们可以对多项式C进行快速幂,多项式乘法用FFT加速。
注意FFT最后大于m-2的项要加到其下标对于m-1取模的下标里,详见代码。

参考代码

#include<cstdio>
#include<algorithm>
#include<cmath>
#define fo(i,a,b) for(i=a;i<=b;i++)
#define fd(i,a,b) for(i=a;i>=b;i--)
using namespace std;
typedef long long ll;
const ll maxm=8000+10,mo=1004535809,GG=3;
ll ind[maxm],a[maxm*3],b[maxm*3],c[maxm*3],e[maxm*3],f[maxm*3],s[maxm*3],w[maxm*3],tt[maxm*3];
double ce;
ll i,j,k,l,r,t,n,m,q,top,len,ni;
ll quicksortmi(ll x,ll y,ll z){
    if (!y) return 1;
    ll t=quicksortmi(x,y/2,z);
    t=t*t%z;
    if (y%2) t=t*(x%z)%z;
    return t;
}
void DFT(ll *a,ll sig){
    fo(i,0,len-1){
        ll p=0;
        for(ll j=0,tp=i;j<ce;j++,tp/=2) p=(p<<1)+(tp%2);
        tt[p]=a[i];
    }
    for(ll m=2;m<=len;m*=2){
        ll half=m/2,bei=len/m;
        fo(i,0,half-1){
            ll wi=(sig>0)?w[i*bei]:w[len-i*bei];
            for(ll j=i;j<len;j+=m){
                ll u=tt[j],v=tt[j+half]*wi%mo;
                tt[j]=(u+v)%mo;
                tt[j+half]=((u-v)%mo+mo)%mo;
            }
        }
    }
    if (sig==-1)
        fo(i,0,len-1) tt[i]=tt[i]*ni%mo;
    fo(i,0,len-1) a[i]=tt[i];
}
void FFT(ll *a,ll *b,ll *c){
    ll i;
    fo(i,0,len-1) e[i]=a[i],f[i]=b[i];
    DFT(e,1);DFT(f,1);
    fo(i,0,len-1) e[i]=e[i]*f[i]%mo,c[i]=0;
    DFT(e,-1);
    fo(i,0,len-1) c[i%(m-1)]=(c[i%(m-1)]+e[i])%mo;
    //fo(i,m-1,len-1) c[i]=0;
}
void solve(ll n){
    ll i;
    if (n==1){
        fo(i,0,len-1) b[i]=c[i];
        return;
    }
    solve(n/2);
    FFT(b,b,b);
    if (n%2) FFT(b,c,b);
}
int main(){
    scanf("%lld%lld%lld%lld",&n,&m,&q,&top);
    fo(i,1,top){
        scanf("%lld",&j);
        s[i]=j;
    }
    len=1;
    while (len<m*2) len*=2;
    ni=quicksortmi(len,mo-2,mo);
    ce=double(log(len)/log(2));
    w[0]=1;w[1]=quicksortmi(GG,(mo-1)/len,mo);
    fo(i,2,len) w[i]=w[i-1]*w[1]%mo;
    fo(i,1,m-1){
        fo(j,1,m-1){
            k=quicksortmi(i,j,m);
            if (k==1) break;
        }
        if (j==m-1){
            r=i;
            break;
        }
    }
    fo(j,0,m-2) ind[quicksortmi(i,j,m)]=j;
    a[ind[1]]=1;
    fo(i,1,top) 
        if (s[i]) c[ind[s[i]]]=1;
    solve(n);
    printf("%lld\n",b[ind[q]]);
}
LVGL 实战:虚拟列表与对象复用机制在嵌入式GUI中的性能优化 本文深入探讨LVGL虚拟列表与对象复用机制在嵌入式GUI中的性能优化实践。通过复用机制动态管理UI对象,大幅降低内存占用,实现无限滚动列表的流畅体验。文章详细解析核心算法、内存优化策略及跨平台适配技巧,帮助开发者在资源受限设备上高效处理大量数据展示。 阅读详情

相关推荐

GD32 I2C中断通信实战:主机与从机高效数据交换方案

本文详细解析了GD32微控制器I2C中断通信的实战方案,通过配置I2C0为主机、I2C1为从机,实现高效的双向数据交换。文章深入剖析了中断服务程序(ISR)的核心配置、关键状态标志位处理以及事件驱动机制,帮助开发者避免常见陷阱,提升系统响应速度与资源利用率,适用于传感器连接、多机通信等嵌入式场景。

cream的博客 846

【bzoj3992】序列统计 FFT 原根

给一个集合,用这个集合组成的长度为n的序列中,在mod m下乘积为x的个数。n 首先可以把乘积变为原根的指数相加的形式,然后取模FFT即可。 #include #include #include #include #include #define Rep(i, x, y) for (int i = x; i <= y; i ++) #define Dwn(i, x, y) for

Owen_hzt的专栏 940

从打印攻击到视频重放:手把手用OULU-NPU训练你的第一个活体检测模型

本文详细介绍了如何使用OULU-NPU数据集训练活体检测模型,以应对打印攻击和视频重放等安全威胁。通过PyTorch框架,从环境准备、数据加载、预处理到模型架构设计,手把手教你构建一个高效的双流网络,结合CNN和LSTM技术,提升模型在多种攻击场景下的检测准确率。

weixin_29092031的博客 386

[原根 + NTT] LOJ#2183 BZOJ3992:「SDOI2015」序列统计

做法比较显然,应该就是这样的 DPDPDP : f(i)=∑j∗k≡i(modm)f′(j)g(k)f(i)=∑j∗k≡i(modm)f′(j)g(k) f(i)=\sum_{j*k \equiv i \pmod m} f'(j)g(k) 可以用原根转化为加法,就变成 f(i)=∑j+k≡i(modm)f′(j)g(k)f(i)=∑j+k≡i(modm)f′(j)g(k) f(i)=\...

Lynstery's blog 528

Manimgl 进阶笔记

目录 一、调整视频输出的纵横比 二、调整预览窗口的尺寸 三、在开发工具中直接调试 一、调整视频输出的纵横比 调整输出视频的纵横比,在日常开发中属于比较基本的需求。要使用 Manimgl 得到期望的分辨率的视频输出需要修改以下几个地方: 第一步:在 custom_config.yml 配置文件中通过 camera_qualities设置视频的输出分辨率。manimlib 框架已经在 default_config.yml 文件中设置了四种视频输出分辨率,default_qualities 参数.

gunnery的专栏 2859

Windows下Cppcheck静态测试全流程:从安装到生成HTML报告的避坑指南

本文详细介绍了在Windows平台下使用Cppcheck进行静态代码分析的全流程,包括环境搭建、插件配置、自动化脚本编写及HTML报告生成。重点解析了MISRA插件集成、常见问题排查以及性能优化技巧,帮助C/C++开发者高效提升代码质量。文章特别针对Windows环境下的路径处理、空格问题等细节提供了实用解决方案。

weixin_29313547的博客 201

[SDOI2015]序列统计 (NTT)

乘法NTT?!

348

在MATLAB和Simulink中设计并仿真一个智能建筑能效优化系统

智能建筑能效优化是现代建筑管理的重要组成部分,旨在通过智能化手段降低能源消耗、减少碳排放并提高居住舒适性。通过Simulink进行智能建筑能效优化仿真,可以验证控制策略的有效性、优化系统设计并降低开发成本。以下是如何在MATLAB和Simulink中设计并仿真一个智能建筑能效优化系统的详细步骤。通过上述步骤,我们成功设计并实现了基于Simulink的智能建筑能效优化仿真。该系统能够模拟复杂的建筑环境,验证能效优化策略的有效性,并通过优化设计提高建筑的能源利用效率和居住舒适性。

xiaoheshang_123的博客 139

BZOJ3992(NTT+DP+快速幂)

题面 题意是给你一个质数M,和一个元素都小于M 的集合,大小为S,用集合中的元素构成长度为N的序列(可以用重复的元素),使其乘积模M为x,问方案数,答案模479*2^21+1。 M 这题一看就很套路,模数为费马素数,大概就和NTT有关吧。 先考虑简单的DP,设f[i][j]为长度为i的序列,乘积模M等于j的方案数 枚举k,有 f[i+1][j∗k模M]+=f[i][j]f[i+1][j

KKiseki的博客 499

(全网最详细教程)康耐视读码器(以DM260S为例子)详细实用步骤

(全网最详细教程)康耐视读码器(以DM260S为例子)详细实用步骤

视觉人机器视觉的博客 7467

在 IW31 录入班次与当班负责人,并让 IW38 列表同步显示:基于 IWO10018 + IWOC0004 的一套可落地增强方案

摘要 本文详细介绍了在SAP PM模块中实现工厂设备维护订单增强的完整方案,重点解决两个核心需求:在订单创建时新增班次负责人和班次字段,并在订单列表中直接显示这些信息。文章从需求分析、技术设计到具体实现步骤进行了系统阐述。 关键实现步骤包括: 通过CI_AUFK结构扩展AUFK表,确保字段持久化存储 使用IWO10018增强在IW31/IW32/IW33事务中添加输入界面 通过IWOC0004增强在IW38订单列表中显示新增字段 采用优化的数据填充策略提升性能 该方案不仅满足业务需求,还考虑了用户体验和系统

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 176

【BZOJ3992】序列统计(SDOI2015)-NTT+循环卷积+快速幂

测试地址:序列统计 做法:本题需要用到NTT+循环卷积+快速幂。 这个题我们很快就想出状态转移:令f(i,j)f(i,j)f(i,j)为前iii个数的乘积模mmm的结果为jjj的数列方案数,那么有: f(i,j)=∑0≤k&lt;m∑l∈S[(k×l)%m=j]f(i−1,k)f(i,j)=∑0≤k&lt;m∑l∈S[(k×l)%m=j]f(i−1,k)f(i,j)=\sum_{0\le k...

Maxwei_wzj的OI世界 757

Nvidia Orin Driveos Camera 介绍及调试详解

自动驾驶-nvidia orin driveos Camera 驱动详解及调试

u011803281的博客 2992

bzoj3992 [SDOI2015]序列统计(NTT快速幂)

bzoj3992 [SDOI2015]序列统计 原题地址:http://www.lydsy.com/JudgeOnline/problem.php?id=3992 题意: 小C有一个集合S,里面的元素都是小于M的非负整数。他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S。 小C用这个生成器生成了许多这样的数列。但是小C有一个问题需要你的帮助:给定整数x,

Bfk的博客 461

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

BZOJ 3992: [SDOI2015]序列统计

二次联通门 :BZOJ 3992: [SDOI2015]序列统计 /* BZOJ 3992: [SDOI2015]序列统计 先求出原根 然后化乘为加 求出母函数 快速幂 + NTT 即可 */ #include <cstdio> #include <iostream> ...

weixin_30258901的博客 96

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【BZOJ3992】[SDOI2015]序列统计 NTT+多项式快速幂

【BZOJ3992】[SDOI2015]序列统计 Description 小C有一个集合S,里面的元素都是小于M的非负整数。他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S。 小C用这个生成器生成了许多这样的数列。但是小C有一个问题需要你的帮助:给定整数x,求所有可以生成出的,且满足数列中所有数的乘积mod M的值等于x的不同的数列的有多少个。小C认为...

weixin_30349597的博客 83

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

BZOJ3992 [SDOI2015]序列统计

本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/转载请注明出处,侵权必究,保留最终解释权! 题目链接:BZOJ3992 正解:$NTT$+原根 解题报告:     考虑朴素$DP$:令$f[i][...

dgoh41514的博客 163

【BZOJ3992】【SDOI2015】序列统计

【题目链接】点击打开链接【思路要点】先求出\(M\)的原根,然后我们就可以把乘法转化为加法。然后NTT快速幂求出数集的\(N\)次方就行了,注意虽然多项式的次数界会不断上升,但由欧拉定理,我们可以将次数界重新降低至\(M\),相当于每乘一次,做一次取模。时间复杂度\(O(MLogNLogM)\)。【代码】#include&lt;bits/stdc++.h&gt; using namespace s...

cz_xuyixuan的博客 277

[BZOJ 3992][SDOI2015]序列统计

3992: [SDOI2015]序列统计 Time Limit: 30 SecMemory Limit: 128 MBSubmit: 2275Solved: 1090[Submit][Status][Discuss] Description 小C有一个集合S,里面的元素都是小于M的非负整数。他用程序编写了一个数列生成器,可以生成一个长度为N的数 列,数列中的每...

weixin_30835923的博客 94

BZOJ 3992 SDOI2015 序列统计

FFT

Fuxey 8723

bzoj3992 [SDOI2015]序列统计

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3992 【题解】 很容易得到一个dp但是复杂度不对 我们想到用原根把乘法改成加法。 然后a1a2...an=g^(b1+b2+...+bn) 我们找到g^k=x,那么就有b1+b2+...+bn=x(mod (m-1))(m-1就是phi(m)) 考虑生成函数,那么即为生...

aklm45097的博客 104

[BZOJ3992][SDOI2015]序列统计

[BZOJ3992][SDOI2015]序列统计 试题描述 小C有一个集合 \(S\),里面的元素都是小于 \(M\) 的非负整数。他用程序编写了一个数列生成器,可以生成一个长度为 \(N\) 的数列,数列中的每个数都属于集合 \(S\)。小C用这个生成器生成了许多这样的数列。但是小C有一个问题需要你的帮助: 给定整数 \(x\),求所有可以生成出的,且满足数列中所有数的乘积 \(\mod M\)...

weixin_30724853的博客 112

bzoj3992【SDOI2015】序列统计

思路很好的NTT

AaronPolaris 1909

bzoj3992: [SDOI2015]序列统计

传送门:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3992 思路:M是一个质数,问题又是求乘积,于是我们就可以想到利用M的原根g把问题变成求和(我怎么想不到啊。。。) 根据原根的性质,我们可以把1到M-1中的数i表示为(g^b[i])%M,且指数互不相同 那么X就可以表示成(g^b[x])%M 问题就转化为:然后问题转化成了在序

thy的专栏 1982

BZOJ3992: [SDOI2015]序列统计【NTT+原根+DP】

3992: [SDOI2015]序列统计 【题目描述】 传送门 【题解】 我们可以写出DP式,F[i][j∗a[k]]+=F[i−1][j]F[i][j*a[k]]+=F[i-1][j]F[i][j∗a[k]]+=F[i−1][j] 初始状态F[0][0]=1F[0][0]=1F[0][0]=1 对于上式我们很难处理,如果我们可以将相乘改成相加,就可以套NTT了。 我们设ggg为mod m意义下的...

XSamsara的博客 AFO 290

bzoj 3992 [SDOI2015]序列统计 NTT

题面 题目传送门 解法 先考虑一个最简单的dp:令f[i][j]f[i][j]f[i][j]表示前iii个数的乘积对mmm取模为jjj的方案数,转移比较简单,在这里就不写了。 但是我们会发现,转移的时候是乘法,并没有特别好的优化方式。 注意mmm是一个质数,一定存在原根ggg。那么,我们就可以用ggg的若干次方表示出[1,m)[1,m)[1,m)中的所有数。 现在我们不妨对原来的状态稍作修改,f...

mysterynoip的博客 291
上一篇: 阴阳
下一篇: [bzoj3530][SDOI2014]数数
WerKeyTom_FTD
博客等级 码龄11年 357粉丝 831原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值