「考试」num (破800纪念)
是第800题啦。
怎么说,$rvalue$学长写的已经挺好的了,我在这里做一点补充,写一点理解。
但是这道题真的值得写一下题解,毕竟一百行也算是数论工程题了。
定义函数
$Fp(k,n)$为$n$中$k$的最大幂次。
$Ext(k,n)=n/Fp(k,n)$
我们要求的就是$Ext(10,n!)%1000$
怎么做。
首先$Ext$函数在$k$为质数的情况下是完全积性函数。(这里zsq学长出锅了,没有说k是质数)
这个证都不用证吧。。。根据定义直接出了。
好到这步我都懂,甚至看到最后我都懂。
可是根本想不到。
这一步就是切入题目的最关键点了。
为什么要设立这样一个函数。
其实目的就是转化问题,本来让人摸不着头脑的题一下子思路就清晰起来了。
可能这就是公式思想。把不会的转化为公式,然后用数学方法死刚公式就行了。
然而$10$不是质数,不是很好求,所以我们用$CRT$合并对$Ext(10,n!)$求解。
代出两个互质部分的式子。
$Ext(10,n!)=\frac{n!}{2^{Fp(5,n!)}5^{Fp(5,n!)}}$
一种经典的$O(log_5(n))$阶乘求因子方法,可以很快的求出$Fp(5,n!)$,$2^c$和$5^c$互质,可以直接欧拉定理求逆元。
所以其实求$Ext(5,n!)$即可。
在$K==1$的时候。我们将$10$拆分成$2$和$5$。
利用$Ext$的完全积性。
$Ext(5,n!) \equiv \prod \limits_{i=1}^{n!}Ext(5,i)(mod\ 5)$
$\equiv \prod \limits_{i=1,5|i}^{n!}Ext(5,\frac{i}{5})\prod \limits_{i=1,5\perp i}^{n}Ext(5,i)(mod\ 5)$
$\equiv Ext(5,\frac{n!}{5})\prod \limits_{i=1,5\perp i}^{n}i(mod\ 5)$
$\equiv Ext(5,\frac{n!}{5})(\prod \limits_{i=1,5\perp i}^{5}i)^{\frac{n}{5}} \prod \limits_{i=1,5\perp i}^{n\%5} i (mod\ 5)$
发现是个递归式。
一千的话,同理也可以快速递归的到答案。
但是要写高精所以就很麻烦了。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1e2+;
typedef long long ll;
inline void read(int &x)
{
x=;char c=getchar();
while(c<''||c>'') c=getchar();
while(c>=''&&c<='') x=(x<<)+(x<<)+c-,c=getchar();
}
const int tw[]={,,,},fi[]={,,,},phif[]={,,,},mo[]={,,,};
int T,K,tc,fr,se,num;
char s[maxn];
int add(int x,int y,int mod) {return x+y>=mod?x+y-mod:x+y;}
int mul(int x,int y,int mod) {return 1LL*x*y%mod;}
int qw(int a,int b,int mod)
{
int ans=;
for(;b;b>>=,a=mul(a,a,mod)) if(b&) ans=mul(ans,a,mod);
return ans;
}
struct Bigdata{
int a[maxn];
bool isz() {return a[]==&&a[a[]]==;}
void init(char *s)
{
memset(a,,sizeof(a));
a[]=strlen(s+);
for(int i=a[];i>=;--i) a[i]=s[a[]-i+]-;
}
void divf(int m)
{
int x=;
for(int i=a[];i>=;--i) x=x*+a[i],a[i]=x/m,x%=m;
while(!a[a[]]&&a[]>) --a[];
}
int getm(int mod)
{
int res=;
for(int i=a[];i>=;--i) res=add(a[i],mul(res,,mod),mod);
return res;
}
int getn() {int res=;for(int i=a[];i>=;--i) res=res*+a[i];return res;}
void print() {for(int i=;i<=a[];++i) printf("%d",a[i]);puts("");}
}n,tmp;
int nfac(Bigdata &t,int m,int mod)
{
int ans=;
while(!t.isz())
{
t.divf(m);
ans=add(ans,t.getm(mod),mod);
}
return ans;
}
void lit(int n,int K)
{
const int mod=1e5;ll ans=;
for(int j=,t=j;j<=n;++j,t=j)
{
while(!(t%)) t/=;t%=mod;ans*=t;
while(!(ans%)) ans/=;ans%=mod;
}
for(int i=K;i>=;--i) printf("%lld",(ans/mo[i-])%);puts("");
}
int Ext()
{
if(n.isz()) return ;
int up=n.getm(fi[K]);
tmp=n;tmp.divf(fi[K]);n.divf();
int tc=tmp.getm(phif[K]),t=;
for(int i=;i<=up;++i) if(i%) t=mul(t,i,fi[K]);
return mul(mul(qw(num,tc,fi[K]),t,fi[K]),Ext(),fi[K]);
}
int main()
{
// freopen("ex_num2.in","r",stdin);
// freopen("a.out","w",stdout);
read(T);
while(T--)
{
scanf("%s",s+);n.init(s);read(K);
if(n.a[]<=) {lit(n.getn(),K);continue;}
tmp=n;
tc=nfac(tmp,,phif[K]);
fr=qw(qw(,tc,fi[K]),phif[K]-,fi[K]);
for(int i=num=;i<=fi[K];++i) if(i%) num=mul(num,i,fi[K]);
se=Ext();
se=mul(se,fr,fi[K]);
while(se%tw[K]) se=add(se,fi[K],tw[K]*fi[K]);
for(int i=K;i>=;--i) printf("%d",(se/mo[i-])%);puts("");
}
return ;
}
num
最后$%%%zsq$学长,教我多项式,题解写的又好。
「考试」num (破800纪念)的更多相关文章
- 【LOJ】#3090. 「BJOI2019」勘破神机
LOJ#3090. 「BJOI2019」勘破神机 为了这题我去学习了一下BM算法.. 很容易发现这2的地方是\(F_{1} = 1,F_{2} = 2\)的斐波那契数列 3的地方是\(G_{1} = ...
- 「考试」CSP-S 2020
乱扯 爆炸的过程是这样的 写了\(2.5h\)的\(T1\)过不去大样例,自闭了 决定调\(T2\)然后过了样例但事实上写的完全是假的 这个时候突然\(T1\)灵光一闪就没再看\(T2\)了 然后就一 ...
- 「考试」noip模拟9,11,13
9.1 辣鸡 可以把答案分成 每个矩形内部连线 和 矩形之间的连线 两部分 前半部分即为\(2(w-1)(h-1)\),后半部分可以模拟求(就是讨论四种相邻的情况) 如果\(n^2\)选择暴力模拟是有 ...
- loj 3090 「BJOI2019」勘破神机 - 数学
题目传送门 传送门 题目大意 设$F_{n}$表示用$1\times 2$的骨牌填$2\times n$的网格的方案数,设$G_{n}$$表示用$1\times 2$的骨牌填$3\times n$的网 ...
- 「考试」$5T$
啊因为最近题实在是好啊,只能四五篇四五篇写了. T1. 括号序列的确简单. 当我们维护左右$cnt$后. 到一个左括号的地方的话. 答案就是:$$\sum\limits_{i=1}^{min(lc,r ...
- 「考试」小P的生成树
考场上想到一半正解,没想到随机化,不然也许能够$A$掉. 题目所说的其实就是向量加法,求模长最长的向量生成树. 我们考虑对于两个向量,必然在平行边形对角线方向上,他们的投影和是最大的,长度就是对角线长 ...
- 「考试」 Or
不得不说是一道多项式神题了. 虽然说颓代码颓的很厉害不过最终A掉了. 好好讲一讲这道题. 涉及的知识点是:高阶导数,NTT,指数型母函数,泰勒公式,以及意志力和数学推导能力. 那就开始了. 一个测试点 ...
- 「考试」weight
正解是树剖. 首先Kru求最小生成树. 然后分别考虑树边和非树边的答案. 首先是非树边,非树边链接的两个点在MST上能够构成一条链. 这条链上最大的那条边-1就是这条边的答案. 为什么. 模拟Kru的 ...
- LOJ 3090 「BJOI2019」勘破神机——斯特林数+递推式求通项+扩域
题目:https://loj.ac/problem/3090 题解:https://www.luogu.org/blog/rqy/solution-p5320 1.用斯特林数把下降幂化为普通的幂次求和 ...
随机推荐
- [Note] 使用Code Snippet简化编码
使用NewtonSoft.Json写实体类时大量格式一致的代码出现 ,这时可以使用Code snippet来加快编码速度 [JsonProperty(PropertyName = "mess ...
- Spring Boot WebFlux 快速入门实践
02:WebFlux 快速入门实践 Spring Boot 2.0 spring.io 官网有句醒目的话是: BUILD ANYTHING WITH SPRING BOOT Spring Boot ( ...
- 我的Java秋招面经大合集
阿里面经 阿里中间件研发面经 蚂蚁金服研发面经 岗位是研发工程师,直接找蚂蚁金服的大佬进行内推. 我参与了阿里巴巴中间件部门的提前批面试,一共经历了四次面试,拿到了口头offer. 然后我也参加了 ...
- Oracle VM VirtualBOX桥接网卡
1.在VirtualBOX设置中的网络菜单,连接方式选择桥接网卡 2.启动系统,设置静态IP sudo vim /etc/network/interfaces auto enp0s3 ...
- Failure to transfer org.springframework:spring-jcl:jar:5.0.7.RELEASE from
错误信息: Failure to transfer org.springframework.boot:spring-boot-maven-plugin:pom:1.5.4.RELEASE from h ...
- Jmeter中逻辑控制器
1.ForEach控制器 操作如下: 对应结果: 2.if controller(类似于if语句,根据给定表达式的值决定是否执行该节点下的字节的) 3.交替控制器(根据线程组中的循环次数来设定子节点中 ...
- Jenkins邮件收发(qq邮箱)
首先确认QQ邮箱SMTP服务器的地址和端口号.如下图所示,请谨记,JENKINS全局邮箱配置需要使用: 步骤1:开启QQ邮箱的smtp服务:登陆QQ邮箱-设置-账户-开启POP3/SMTP服务-完成“ ...
- PHP会话机制---session的基本使用
登录网站后,在每个网页都能拿到用户信息 (1) 使用超链接传递用户名,这样太繁琐了,不建议使用 . (2) 使用数据库,每打开一个页面都查询一次用户信息表,这样网页加载速度变慢,用户体验变差. (3) ...
- HTTPS 验证访问略记
背景 互联网刚刚兴起的时候,网络安全并没有被很好的重视.HTTP 是明文传输的,这为意图谋不道德之事者提供了诸多的便利.当越来越多的人利益受到侵害的时候,开始重视网络传输的安全问题了. HTTPS 加 ...
- SpringBoot:1.开启SpringBoot之旅
什么是 Spring Boot Spring Boot是Spring团队设计用来简化Spring应用的搭建和开发过程的框架.该框架对第三方库进行了简单的默认配置,通过Spring Boot构建的应用程 ...