ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

noip模拟58(待补)

2021-09-22 20:33:23  阅读:162  来源: 互联网

标签:md ch 58 noip bell 待补 ll freopen define


A. Lesson5!

B. 贝尔数

考场上只差一个矩阵快速幂.

还是对快速幂的模型掌握的不够好.

快速幂一定是有周期性的,是有规律可寻的.

而本题中可以看出是对连续的一端区间取模.

那么一定就应该是一段周期性的序列.

每次可以选择把序列向左移动 \(P\ -\ 1\) 个格子.

于是快速幂就很可做了.

B_code
#include<bits/stdc++.h>
using namespace std;
namespace BSS {
	#define ll long long int
	#define ull unsigned ll
	#define lf double
	#define lbt(x) (x&(-x))
	#define mp(x,y) make_pair(x,y)
	#define lb lower_bound 
	#define ub upper_bound
	#define Fill(x,y) memset(x,y,sizeof x)
	#define Copy(x,y) memcpy(x,y,sizeof x)
	#define File(x,y) freopen(#x,"r",stdin),freopen(#y,"w",stdout)
	#define FILE(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
	inline ll read() {
		int ss=0; bool cit=1; char ch;
		while(!isdigit(ch=getchar())) if(ch=='-') cit=0; 
		while(isdigit(ch)) ss=(ss<<3)+(ss<<1)+(ch^48),ch=getchar();
		return cit?ss:-ss;
	}
} using namespace BSS;

const ll mod=95041567;

ll m,n,Ts,ans;
ll md[7]={0,31,37,41,43,47};
ll f[57],bell[1007];
ll C[1007][1007],g[57][57];
ll exgcd(ll a,ll b,ll &x,ll &y){
	if(!b) return x=1,y=0,a;
	ll d=exgcd(b,a%b,x,y),z=x;
	return x=y,y=z-y*(a/b),d;
}
inline void mul(ll now){
	ll c[57]={0};
	for(int i=1;i<=now;i++){
		for(int j=1;j<=now;j++)
				c[i]=(c[i]+f[j]*g[j][i]%now)%now;
	}
	Copy(f,c);
}
inline void mulself(ll now){
	ll c[57][57]={0};
	for(int i=1;i<=now;i++){
		for(int j=1;j<=now;j++)
			for(int k=1;k<=now;k++)
				c[i][j]=(c[i][j]+g[i][k]*g[k][j]%now)%now;
	}
	Copy(g,c);
}
inline ll solve(ll x){
	Fill(g,0),Fill(f,0);
	ll b=n/(md[x]-1),st=n%(md[x]-1);
	for(int i=1;i<=md[x];i++){
		f[i]=bell[st+i-1]%md[x];
	}
	g[md[x]][1]=1;
	for(int i=2;i<=md[x];i++) g[i-1][i]=1,g[i][i]=1;
	for(;b;b>>=1,mulself(md[x])) if(b&1) mul(md[x]);
	return f[1]%md[x];
}
signed main(){
	FILE(bell);
	bell[0]=1,bell[1]=1; 
	for(int i=0;i<=1000;i++){
		C[i][0]=1;
		for(int j=1;j<=i;j++)
			C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
	}
	for(int i=1;i<=1000;i++){
		for(int j=0;j<=i;j++){
			bell[i+1]=(bell[i+1]+C[i][j]*bell[j]%mod)%mod;
		}
	}
	Ts=read(); ll res,cnt,x,y;
	while(Ts--){
		n=read(),ans=0; if(n<=1000){ printf("%lld\n",bell[n]); continue; } 
		for(int i=1;i<=5;i++){
			res=solve(i),exgcd(mod/md[i],md[i],x,y);
			ans=(ans+(x%md[i]+md[i])%mod*res%mod*(mod/md[i])%mod)%mod;
		}
		printf("%lld\n",ans%mod);
	}
	exit(0);
}

C. 穿越广场

考场感觉一定是个 \(dp\).

但是没有再去考虑和字符串有关的算法.

D. 舞动的夜晚

标签:md,ch,58,noip,bell,待补,ll,freopen,define
来源: https://www.cnblogs.com/AaMuXiiiiii/p/15321509.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有