题面在这里!

第一眼感觉炒鸡水啊。。。只要把N质因数分解一下,因为k次约数相当于求k+2元一次方程的非负整数解,所以答案就是和每个质因子指数有关的一些组合数乘起来。

但是要用pillard's rho啊。。。。

(于是现学了一下,发现不会Miller Rabin。。。然后又先去学Miller Rabin 23333)

Miller Rabin 的部分就不说了。。。随便找个博客肯定都讲的比我好多了2333

Pillard's rho 的原理就是生日悖论,随机s个数之后两两作差并与n求gcd,当s不断增大的时候gcd>1的概率逐渐接近于100%

问题是怎么随机。。。

现在普遍在用的方法是 , 先随机一个c,一个x,然后令 y = ( x*x + c ) % n ,求一下gcd(|x-y| , n),如果>1那么返回,否则令x=y。

但是这么做如果找不到的话会一直循环下去,所以要用一下floyd判环(我写的是倍增判环)。。。

生成数列a[]的部分都是一样的,只不过是用 | a[now] - a[pre] | 和 n 取gcd 或 判重,其中 pre = 2^i,且i是满足pre<now的极大的i。。。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define T 20
const int ha=998244353; ll zs[2333],phi,A,ans=1,N;
int cnt=0; ll gcd(ll x,ll y){ return y?gcd(y,x%y):x;} inline ll add(ll x,ll y,const ll ha){ x+=y; return x>=ha?x-ha:x;}
inline void ADD(ll &x,ll y,const ll ha){ x+=y; if(x>=ha) x-=ha;} inline ll mul(ll x,ll y,const ll ha){
ll an=0;
for(;y;y>>=1,ADD(x,x,ha)) if(y&1) ADD(an,x,ha);
return an;
} inline ll ksm(ll x,ll y,const ll ha){
ll an=1;
for(;y;y>>=1,x=mul(x,x,ha)) if(y&1) an=mul(an,x,ha);
return an;
} inline bool Mr(ll x){
if(x==2) return 1;
if(x==1||!(x&1)) return 0; int k=0;
ll now,pre,ci=x-1,b; for(;!(ci&1);ci>>=1,k++); for(int i=1;i<=T;i++){
b=rand()%(x-2)+2; now=ksm(b,ci,x),pre=now; for(int j=1;j<=k;j++,pre=now){
now=mul(now,now,x);
if(now==1&&pre!=1&&pre!=x-1) return 0;
} if(now!=1) return 0;
} return 1;
} inline ll Get(const ll x,const ll M){ return add(mul(x,x,M),A,M);} inline ll Pr(ll n,ll c){
for(ll i=2,k=2,x=rand()%(n-1)+1,y=x,d;;i++){
x=add(mul(x,x,n),c,n); d=gcd(llabs(x-y),n);
if(d>1&&d<n) return d; if(x==y) return n; if(i==k) y=x,k<<=1;
}
} void Find(ll x){
if(Mr(x)){ zs[++cnt]=x; return;} ll p=x;
while(p==x) p=Pr(p,rand()%(x-1)+1); Find(p),Find(x/p);
} /*
int main(){
// freopen("data.in","r",stdin);
// freopen("data.out","w",stdout); // srand(time(0)); scanf("%lld",&N);
Find(N),sort(zs+1,zs+cnt+1); for(int i=1;i<=cnt;i++) ans*=(ll)(zs[i]==zs[i-1]?zs[i]:(zs[i]-1)); printf("%lld\n",ans); return 0;
}
*/ ll K;
int inv[67]; int C(ll x,int y){
int an=inv[y];
for(ll i=x-y+1;i<=x;i++) an=an*(ll)(i%ha)%ha;
return an;
} int main(){
srand(time(0)+19260817); inv[1]=inv[0]=1;
for(int i=2;i<=62;i++) inv[i]=-inv[ha%i]*(ll)(ha/i)%ha+ha;
for(int i=2;i<=62;i++) inv[i]=inv[i]*(ll)inv[i-1]%ha; cin>>N>>K; if(N<=1e9){
for(int i=2;i*(ll)i<=N;i++) while(!(N%i)) N/=i,zs[++cnt]=i;
if(N!=1) zs[++cnt]=N;
}
else Find(N),sort(zs+1,zs+cnt+1); zs[cnt+1]=0;
for(int i=1,tot=0;i<=cnt;i++){
tot++;
if(zs[i]!=zs[i+1]){
ans=ans*(ll)C((ll)tot+K+1ll,tot)%ha;
tot=0;
}
} cout<<ans<<endl;
return 0;
}

  

luogu 6月月赛 E 「数学」约数个数和的更多相关文章

  1. 洛谷 P4714 「数学」约数个数和 解题报告

    P4714 「数学」约数个数和 题意(假):每个数向自己的约数连边,给出\(n,k(\le 10^{18})\),询问\(n\)的约数形成的图中以\(n\)为起点长为\(k\)的链有多少条(注意每个点 ...

  2. P4714 「数学」约数个数和

    题解: 会了Miller-Rabin这题就很简单了 首先这种题很容易想到质因数分解 但是暴力根号算法是不行的 所以要用到 Miller-Rabin素数 https://blog.csdn.net/lt ...

  3. 【LGP4714】「数学」约数个数和

    题目 众所周知,除数个数函数\(\sigma_0=I^2\),\(I\)就是狄利克雷卷积里的\(1\)函数 于是熟悉狄利克雷卷积的话很快就能看出我们要求的就是\(I\times I^{k}\),即\( ...

  4. Codeforces 626E Simple Skewness 「数学」「二分」

    题意: 给你一堆无序数,寻找它的一个子堆,使得子堆的平均数减中位数最大. 数字的个数n<=2e5 0<=xi<=1e6. 思路: 首先可以证明这堆数一定是奇数个,证明方法是尝试在奇数 ...

  5. luogu 11月月赛 斐波那契数列

    本来想作为水题刷,很快就想出了做法,结果细节实现太差改了好久... 根据题意你会发现其实就是求方程 ax+by=k解的个数. 此时 a=f[i],b=f[i+1],而(x,y)就是你要求的数对. 于是 ...

  6. luogu 5月月赛 #A

    T29693 取石子 题目描述 Alice 和 Bob 在玩游戏 他们有 n 堆石子,第 i 堆石子有ai​ 个,保证初始时 ai​≤ai+1​(1≤i<n) . 现在他们轮流对这些石子进行操作 ...

  7. LUOGU 9月 月赛

    T1 签到题 传送门 解题思路 将原式化简一下,让n个1变成 (10^n-1)/9 ,然后再移项,变成了高次同余形式,用bsgs求解.交了好几次都是80,后来才被告知要快速乘. 代码 #include ...

  8. 「10.8」simple「数学」·walk「树上直径」

    A. Simple 本来以为很难,考场瞎推了推好像会了...... 想起小凯的诱惑,迷?? 首先$n$,$m$,$q$同除$gcd(n,m)$,显然$q$以内的数假如不是$gcd$的倍数,那么一定不能 ...

  9. 「BZOJ 3994」「SDOI 2015」约数个数和「莫比乌斯反演」

    题意 设\(d(x)\)为\(x\)的约数个数,求\(\sum_{i=1}^{n}\sum_{j=1}^{m}d(ij)\). 题解 首先证个公式: \[d(ij) = \sum_{x|i}\sum_ ...

随机推荐

  1. Problem L. Visual Cube(杭电多校2018年第三场+模拟)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6330 题目: 题意:给你长宽高,让你画出一个正方体. 思路:模拟即可,湘潭邀请赛热身赛原题,不过比那个 ...

  2. ajax post请求json数据在spring-controller解析

    1.前端post请求数据: userInfo=[{"id":"5","uname":"小李","phone&q ...

  3. TensorFlow 模型保存和导入、加载

    在TensorFlow中,保存模型与加载模型所用到的是tf.train.Saver()这个类.我们一般的想法就是,保存模型之后,在另外的文件中重新将模型导入,我可以利用模型中的operation和va ...

  4. Python中的异常处理 -- (转)

    python中的异常   异常是指程序中的例外,违例情况.异常机制是指程序出现错误后,程序的处理方法.当出现错误后,程序的执行流程发生改变,程序的控制权转移到异常处理. Exception类是常用的异 ...

  5. JavaWeb使用Session防止表单重复提交

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 1.什么是表单 ...

  6. 設定 gpio 為 讀取用途,需注意的參數

    Schematic 解說 上面的 線路圖, R1 R2 只能有一個被接上, R3 R4 只能有一個被接上, 是使用 gpio 讀取 電壓 判斷為0 或是 1 這時的 gpio 設定,其中一個參數需設為 ...

  7. C# 判断一个单链表是否有环及环长和环的入口点

    1.为什么写这个随笔? 前几天参加一个电面,被问到这个问题,想总结一下. 2.为什么标题强调C#? 想在网上看看代码,却没找到C#版的,于是自己用C#实现一下. 一.解决问题的思路 1.一种比较耗空间 ...

  8. [转载]NGINX原理分析 之 SLAB分配机制

    作者:邹祁峰 邮箱:Qifeng.zou.job@hotmail.com 博客:http://blog.csdn.net/qifengzou 日期:2013.09.15 23:19 转载请注明来自&q ...

  9. SQL Server 连接字符串和身份验证 学习

    SQL Server .NET Data Provider 连接字符串包含一个由一些属性名/值对组成的集合.每一个属性/值对都由分号隔开.          PropertyName1=Value1; ...

  10. jmeter+Jenkins 持续集成中发送邮件报错:MessagingException message: Exception reading response

    已经配置好了发送邮件的相关信息,但是执行完脚本出现报错:MessagingException message: Exception reading response 1.查看Jenkins本次构建的控 ...