T1 整除

解题思路

答案就是 n 的每一个质因数的合法的答案数相乘(证明的话就。。。。)

但是复杂度显然不允许(虽然我们可以给指数取模水过去)。。

可以用积性筛(线性筛)利用质数筛出 \(x^m\) 然后就可以计算答案了

code

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Failed"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=60,mod=998244353;
int n,task,m,cnt,c,ans,T,pri[10010],res[10010],s[N];
bool vis[10010];
int exgcd(int a,int b,int &x,int &y)
{
if(!b) return x=1,y=0,a;
int d=exgcd(b,a%b,x,y);
int z=y; x=y; y=z-(a/b)*y;
return d;
}
int power(int x,int y,int p=mod)
{
int temp=1; y%=p-1;
while(y)
{
if(y&1) temp=temp*x%p;
x=x*x%p; y>>=1;
}
return temp;
}
void solve()
{
c=read(); m=read(); ans=1;
for(int i=1;i<=c;i++) s[i]=read();
for(int i=1;i<=c;i++)
{
int sum=0;
for(int j=1;j<=s[i];j++)
if(vis[j]) res[j]=0;
else res[j]=power(j,m,s[i])%s[i];
for(int j=1;j<=s[i];j++)
{
if(res[j]==j%s[i]) sum++;
for(int k=1;k<=cnt&&pri[k]*j<=s[i];k++)
{
res[pri[k]*j]=res[pri[k]]*res[j]%s[i];
if(j%pri[k]==0) break;
}
}
ans=ans*sum%mod;
}
printf("%lld\n",ans);
}
void init()
{
for(int i=2;i<=10000;i++)
{
if(!vis[i]) pri[++cnt]=i;
for(int j=1;j<=cnt&&pri[j]*i<=10000;j++)
vis[i*pri[j]]=true;
}
}
signed main()
{
freopen("division.in","r",stdin); freopen("division.out","w",stdout);
init(); task=read(); T=read(); while(T--) solve();
return 0;
}

T2 糖果

解题思路

倍增 DP 。。

不难发现数据都是有周期的并且大于 \(m\) 的糖果可以直接视为只有 \(m\) 个。

然后我们就可以快速算出每一个数量的糖果的种类数了,然后进行倍增 DP。

设 \(g(i,j)\) 表示前 \(2^i\) 种糖果占 \(j\) 个位置的方案数:

\[g(i,j)=\sum\limits_{k=0}^jg(i-1,k)\times g(i-1,j-k)\times\binom{j}{k}
\]

然后对于相同数量的糖果我们所需要的种类数是一定了,因此用一个类似于上面的柿子加上背包的思想合并起来。

最后 DP 统计答案就好了

code

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Failed"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=1e7+10,M=110,Lg=70,mod=998244353;
unordered_map<int,int> mp;
int T,s[N],n,m,a,b,p,las,maxn,p2[Lg],fac[M],ifac[M],cnt[N],ans[M][M],f[M][Lg][M],g[M][Lg][M],dep[M];
int power(int x,int y,int p=mod){int temp=1;while(y){if(y&1) temp=temp*x%p;x=x*x%p; y>>=1;}return temp;}
int C(int x,int y){return fac[x]*ifac[x-y]%mod*ifac[y]%mod;}
void solve(int lim)
{
for(int i=0;i<=lim;i++) f[lim][0][i]=1;
for(int i=1;i<=60;i++)
for(int j=0;j<=m;j++)
for(int k=0;k<=j;k++)
f[lim][i][j]=(f[lim][i][j]+f[lim][i-1][k]*f[lim][i-1][j-k]%mod*C(j,k))%mod;
int pos=lim; lim=cnt[pos]; g[pos][0][0]=1;
for(int i=60;i>=0;i--)
{
if(p2[i]>lim) continue; lim-=p2[i]; dep[pos]++;
for(int j=0;j<=m;j++)
for(int k=0;k<=j;k++)
g[pos][dep[pos]][j]=(g[pos][dep[pos]][j]+g[pos][dep[pos]-1][k]*f[pos][i][j-k]%mod*C(j,k))%mod;
}
}
signed main()
{
freopen("sugar.in","r",stdin); freopen("sugar.out","w",stdout);
n=read(); m=read(); maxn=s[1]=read(); a=read(); b=read(); p=read();
mp.insert(make_pair(s[1],1));
p2[0]=1; for(int i=1;i<=60;i++) p2[i]=p2[i-1]*2;
fac[0]=ifac[0]=1; for(int i=1;i<=m;i++) fac[i]=fac[i-1]*i%mod;
ifac[m]=power(fac[m],mod-2); for(int i=m-1;i>=1;i--) ifac[i]=ifac[i+1]*(i+1)%mod;
for(int i=2;i<=n;i++)
{
s[i]=(s[i-1]*a+b)%p+1; maxn=max(maxn,s[i]);
if(mp.find(s[i])!=mp.end())
{
las=mp.find(s[i])->second;
T=i-las; break;
}
mp.insert(make_pair(s[i],i));
}
if(!las) las=n+1; maxn=min(maxn,m);
for(int i=1;i<las;i++) cnt[min(m,s[i])]++;
if(T) for(int i=las;i<=las+T-1;i++) cnt[min(m,s[i])]+=(n-i)/T+1;
for(int i=1;i<=m;i++)
if(cnt[i]) solve(i);
else g[i][dep[i]][0]=1;
ans[0][0]=1;
for(int i=1;i<=maxn;i++)
for(int j=0;j<=m;j++)
for(int k=0;k<=j;k++)
ans[i][j]=(ans[i][j]+ans[i-1][j-k]*g[i][dep[i]][k]%mod*C(j,k))%mod;
printf("%lld",ans[maxn][m]);
return 0;
}

T3 打字机

解题思路

和题解的方法一样,对于前缀维护后缀的 \(h(i)\) 表示 \(S\) 长度为 \(i\) 的后缀和 \(T\) 的编辑距离。

那么 \(f(i,j,k)\) 表示考虑了 \(S\) 长度为 \(i\) 的前缀, \(T\) 长度为 \(j\) 的后缀,最大的 \(x\) 使得 \(x-h(x)\le k\)。

于是可以得到 DP 方程:

\[f(i,j,k)=min\{f(i-1,j,k)+1,f(i,j-1,k+1),f(i-1,j-1,k[S-i=T_j])\}
\]

code

#include<bits/stdc++.h>
#define ull unsigned long long
#define f() cout<<"Failed"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=1e5+10,M=22,base=20;
int T,n,m,l,r,len,f[N][M][M<<1];
char s[N],t[M];
void init()
{
memset(f,0x3f,sizeof(f));
for(int i=0;i<=n;i++)
for(int j=0;j<=m;j++)
fill(f[i][j]-m-1+base,f[i][j]+base-j-1+1,-1);
for(int i=base-m-1;i<=base+m;i++) f[0][0][i]=min(f[0][0][i],0);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int k=base-m-1;k<=base+m;k++)
f[i][j][k]=min(f[i][j][k],min(f[i-1][j][k]+1,min(f[i][j-1][k+1],f[i-1][j-1][k-(s[i]==t[j])]+1)));
}
int solve()
{
l=read(); r=read(); len=r-l+1;
return len-(lower_bound(f[r][m]+base-m,f[r][m]+base+m+1,len)-f[r][m])+base;
}
signed main()
{
freopen("print.in","r",stdin); freopen("print.out","w",stdout);
scanf("%s%s",s+1,t+1); n=strlen(s+1); m=strlen(t+1);
init(); T=read(); while(T--) printf("%d\n",solve());
return 0;
}

T4 堆

大坑未补

NOIP模拟60的更多相关文章

  1. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  2. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  3. CH Round #48 - Streaming #3 (NOIP模拟赛Day1)

    A.数三角形 题目:http://www.contesthunter.org/contest/CH%20Round%20%2348%20-%20Streaming%20%233%20(NOIP模拟赛D ...

  4. NOIP模拟赛-2018.11.7

    NOIP模拟赛 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 编译之前另存一份,听说如果敲 ...

  5. NOIP模拟题汇总(加厚版)

    \(NOIP\)模拟题汇总(加厚版) T1 string 描述 有一个仅由 '0' 和 '1' 组成的字符串 \(A\),可以对其执行下列两个操作: 删除 \(A\)中的第一个字符: 若 \(A\)中 ...

  6. 2016-06-19 NOIP模拟赛

          2016-06-19 NOIP模拟赛 by coolyangzc 共3道题目,时间3小时 题目名 高级打字机 不等数列 经营与开发 源文件 type.cpp/c/pas num.cpp/c ...

  7. 2017-9-22 NOIP模拟赛[xxy][数论]

    XXY 的 的 NOIP 模拟赛 4 4 —— 数学专场 A Description定义 f(x)表示 x 的约数和,例:f(12)=1+2+3+4+6+12=28给出 x,y,求Σf(i),i∈[x ...

  8. 2014-10-31 NOIP模拟赛

        10.30 NOIp  模拟赛   时间 空间 测试点 评测方式 挖掘机(dig.*) 1s 256M 10 传统 黑红树(brtree.*) 2s 256M 10 传统 藏宝图(treas. ...

  9. 8.22 NOIP 模拟题

      8.22 NOIP 模拟题 编译命令 g++ -o * *.cpp gcc -o * *.c fpc *.pas 编译器版本 g++/gcc fpc 评测环境 位 Linux, .3GHZ CPU ...

  10. NOIP模拟 1

    NOIP模拟1,到现在时间已经比较长了.. 那天是6.14,今天7.18了 //然鹅我看着最前边缺失的模拟1,还是终于忍不住把它补上,为了保持顺序2345重新发布了一遍.. #   用  户  名   ...

随机推荐

  1. 嘉楠k210 多线程 点亮流水灯

    from Maix import GPIO from fpioa_manager import fm import _thread import time fm.register(24, fm.fpi ...

  2. K8s场景下Logtail组件可观测方案升级-Logtail事件监控发布

    简介: SLS针对Logtail本身以及Logtail的管控组件alibaba-log-controller,采用K8s事件的方式,将处理流程中的关键事件透出,从而让用户能够更清楚的感知其中发生的异常 ...

  3. Flink 源码 | 自定义 Format 消费 Maxwell CDC 数据

    Flink 1.11 最重要的 Feature -- Hive Streaming 之前已经和大家分享过了,今天就和大家来聊一聊另一个特别重要的功能 -- CDC. CDC概述 何为CDC?Chang ...

  4. HBase读链路分析

    ​简介:HBase的存储引擎是基于LSM-Like树实现的,更新操作不会直接去更新数据,而是使用各种type字段(put,delete)来标记一个新的多版本数据,采用定期compaction的形式来归 ...

  5. Azkaban业务流程如何转化为DataWorks业务流程

    简介: 用户在迁移上云的时候,需要将云下的的Azkaban任务迁移上云,之前通过用户在DataWroks一步步创建对应的业务流程,其转化难度和转化时间都是一定的成本和时间,但如何能做到省时省力的方式迁 ...

  6. 使用率激增 250%,这份报告再次将 Serverless 推向幕前

    简介: 本文是对 Datadog 最新的一份 Serverless 报告的解读,欢迎大家留言讨论. 本文是对 Datadog 最新的一份 Serverless 报告的解读,欢迎大家留言讨论.​ 每项新 ...

  7. 每天5分钟复习OpenStack(十三)存储缓存技术Bcache

    Ceph作为一个分布式存储,在项目中常见的形态有两者,一种是采用 SSD 或NVME 磁盘做Ceph的日志盘,使用SATA磁盘来做数据盘.这样的好处是比较经济实惠.另一种则是全部采用 SSD 或NVM ...

  8. dotnet 修复 Uno 中文乱码

    这是一个历史问题,在使用 Uno 展示中文的时候,如果设置 Uno 的底层使用 Skia 系进行渲染,那么将会因为中文字体问题,导致渲染出现乱码.此问题已被我修复,最佳解法是更新到最新版本 在上一篇博 ...

  9. await this.$nextTick()和this.$nextTick(callback)有什么区别?记一次bug调试

    背景 需要实现一个需求,一个小区业务详情页面,在左侧菜单栏切换了小区后,详情页跟着切换. 这个详情页面是根据url上的/:id来确定小区id的,所以切换了小区后,应该切换路由. 于是这样实现: wat ...

  10. 【web安全】修改和配置tomcat版本信息

    场景 目前网络安全的越来越受重视,tomcat作为重要的web容器被广泛应用,如何隐藏信息保证.在开放网络世界中,不易被攻击. 操作思路 1.进入Tomcat文件中的lib文件夹,将catalina. ...