[9018]2006: 方程狂魔

时间限制: 1 Sec  内存限制: 128 MB

题目描述

  qrc 参加了小兔的生日 party。小兔问了他一个问题……

  小兔问:“给定一个关于 x 和 y 的方程:1/x+1/y=1/n!。给定 n 的值,计算这个方程有多少组正整数解?”

  qrc:“这个问题太简单了,我不屑于做。”于是他把这道题扔给了你。

  因为 qrc 会 extgcd,所以你只要告诉他解的个数除以 1000000007(1e9+7)的余数即可。

输入

  一个正整数 n。

输出

  一个数,表示解的个数。

样例输入

  3
  ------
  1439

样例输出

  9
  ----
  102426508

提示

  对于前 20%的数据,n<=10。

  对于前 40%的数据,n<=100。

  对于前 60%的数据,n<=10000。
  对于前 100%的数据,1<=n<=10000000。

题解

  听到学弟们在群上交流他们自己出的题就来看看,意外发现这道题挺有意思,下面是我的做法。

  先把式子化一化

  $$\frac{1}{x}+\frac{1}{y}=\frac{1}{n!}$$

  $$\frac{x+y}{xy}=\frac{1}{n!}$$

  $$xy=n!(x+y)$$

  $$x=\frac{n!y}{y-n!}$$

  $$令z=y-n!$$

  $$x=\frac{n!(n!+z)}{z}$$

  那么问题就变成求存在多少个正整数$z$能整除$n!(n!+z)$,由于$n!(n!+z)=n!^2+n!z$,其中$n!z$显然被$z$整除,我们只要考虑有多少个$z$能整除$n!^2$,那么我们把$1$到$n$都分解质因数,很容易求出$n!^2$的所有质因数个数,然后很容易就可以求出$n!^2$的因数个数,也就是答案,总复杂度可以做到$O(n)$。

代码

#include<cstdio>
#define MN 10000000
#define MP 665000
#define MOD 1000000007
int n,ans=1,u[MN+5],p[MP+5],pn,s[MN+5],c[MN+5];
int main()
{
    register int i,j;
    scanf("%d",&n);
    for(i=2;i<=n;++i)
    {
        if(!u[i])p[++pn]=u[i]=i;
        for(j=1;i*p[j]<=n;++j){u[i*p[j]]=p[j];if(i%p[j]==0)break;}
    }
    for(i=n;i>1;--i)c[u[i]]+=++s[i]<<1,s[i/u[i]]+=s[i];
    for(i=1;i<=pn;++i)ans=1LL*ans*(c[p[i]]+1)%MOD;
    printf("%d",ans);
}
时间: 2024-10-14 05:05:49

[9018]2006: 方程狂魔的相关文章

【比赛题解】03-25生日赛

03-25是小兔的生日-- 这一周是我出题--三道题的难度是 T1<T2<T3 [T1]过生日 其中3<=n,m<=1500 [T2]方程狂魔 其实质数个数是664579个-- [T3]监视 求图的最小生成树,然后天天爱跑步就好.为什么是最小生成树?因为每个小伙伴只会走路径上最大权最小的.先考虑走的边一定是树边:把这个图MST之后,对于一条树上路径,把路径换成另一条非树上路径,结果一定不会更优.因为另一条路径上的最大权值一定没有当前路径上的最大权值更大.而又因为树上权值互异,所以M

LibreOJ #2006. 「SCOI2015」小凸玩矩阵

二次联通门 : LibreOJ #2006. 「SCOI2015」小凸玩矩阵 /* LibreOJ #2006. 「SCOI2015」小凸玩矩阵 本来以为是道数据结构题 后来想了想发现不可做 就考虑二分dp判断 推方程推不出来 就考虑用网络流判断了 二分出一个数 将小于这个数的位置的点编号 每行的可行点与下一行可行的点连边 后一边最大流判断可选出的数的个数是否符合要求即可 */ #include <cstdio> #include <iostream> #include <q

【分享】数学物理方法/方程学习资源合集下载

 二阶椭圆型方程与椭圆型方程组.pdf 3.1 MB  弹性结构的数学理论.pdf 4.2 MB  物理学中的数学方法 第一卷_拜仑.pdf 5.2 MB  物理学中的数学方法 第二卷_拜仑.pdf 5.9 MB  中国科学院研究生教学丛书 数学物理中的渐进方法.pdf 7.4 MB  数学物理方法1(柯朗)(英文版).pdf 5.2 MB  数学物理方法2(柯朗)(英文版).pdf 8.3 MB  数学物理方程与特殊函数(王元明)课后答案.pdf 10.38 MB  数学物理方程与特殊函数-王

poj 2006 Litmus Test 【即zoj 2351:计算酸的PH】

公式:  pH = -log10 [H+]  PH值根据氢离子浓度求出 ,[这里的 [H+] 浓度是摩尔每升为单位的] Ka = [H+] [acid ions] / [acid]   平衡常数K等于分解的氢离子和酸根离子乘积与未分解的酸分子的比值 输入格式:   Ka :常数   ori :初始酸浓度    m :1摩酸分子完全溶解 分解出氢离子数    n :1摩酸分子完全溶解 分解出氢离子数[注意是完全溶解] [这题需要特别注意的是]指数形式是可以直接输入的.如用scanf 或者 prin

IEEE Trans 2006 使用K-SVD构造超完备字典以进行稀疏表示(稀疏分解)

K-SVD可以看做K-means的一种泛化形式,K-means算法总每个信号量只能用一个原子来近似表示,而K-SVD中每个信号是用多个原子的线性组合来表示的. K-SVD算法总体来说可以分成两步,首先给定一个初始字典,对信号进行稀疏表示,得到系数矩阵.第二步根据得到的系数矩阵和观测向量来不断更新字典. 设D∈R n×K,包含了K个信号原子列向量的原型{dj}j=1K,y∈R n的信号可以表示成为这些原子的稀疏线性结合.也就是说y=Dx,其中x∈RK表示信号y的稀疏系数.论文中采用的是2范数来计算

利用图形窗口分割法将极坐标方程:r=cos(θ/3)+1/9用四种绘图方式画在不同的窗口中

利用图形窗口分割法将极坐标方程:r=cos(θ/3)+1/9用四种绘图方式画在不同的窗口中. 解:MATLAB指令: theta=0:0.1:6*pi;rho=cos(theta/3)+1/9; >> polar(theta,rho) >> >> plot(theta,rho) >> semilogx(theta,rho) >> grid >> hist(rho,15) 结果分别如下图: 图1 图2 图3 图4

BZOJ 1041: [HAOI2008]圆上的整点【数论,解方程】

1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4210  Solved: 1908[Submit][Status][Discuss] Description 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数. Input 只有一个正整数n,n<=2000 000 000 Output 整点个数 Sample Input 4 Sample Output 4 HINT 科普视频 So

洛谷 P2312 解方程

题目描述 已知多项式方程: $a_0+a_1x+a_2x^2+..+a_nx^n=0$//用LaTex好看多了 求这个方程在[1, m ] 内的整数解(n 和m 均为正整数) 输入输出格式 输入格式: 输入文件名为equation .in. 输入共n + 2 行. 第一行包含2 个整数n .m ,每两个整数之间用一个空格隔开. 接下来的n+1 行每行包含一个整数,依次为a0,a1,a2..an 输出格式: 输出文件名为equation .out . 第一行输出方程在[1, m ] 内的整数解的个

用python解方程和微积分

用python解方程: from sympy import * x = Symbol('x')  y = Symbol('y') print solve([2* x - y -3,3* x + y -7],[x, y]) 2. 求极限: 代码中的oo就代表无穷. from sympy import * n = Symbol('n') s = ((n+3)/(n+2))**n print limit(s, n, oo) 3. 求定积分: integrate函数用于积分问题. from sympy