luogu P1445 [Violet]嘤F♂A

博主决定更博文啦


这道题一开始没什么思路啊qwq

要求 \(\frac{1}{x}+\frac{1}{y}=\frac{1}{n!}\) 的正整数解总数

首先通分,得 $$\frac{x+y}{xy}=\frac{1}{n!}$$

然后移项,得 $$n!(x+y)=xy$$

↑止步于此↑ $$n!(x+y)-xy=0$$

这里令\(y=n!+k(k\in N^*)\),因为由原方程得出\(y\)是大于\(n!\)

原方程变为 $$n!(x+(n!+k))-x(n!+k)=0$$ $$(n!)^2+xn!+kn!-xn!-xk=0$$ $$xk-kn!=(n!)^2$$ $$k(x-n!)=(n!)^2$$ $$x=\frac{(n!)^2}{k}+n!$$

我们发现\(x,y\)一一对应废话

\(x\)为正整数

所以\(k\)\((n!)^2\)的约数

所以答案就是\((n!)^2\)的约数个数

思维僵化,这篇题解都是看别的大佬题解写的orz

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<ctime>
#include<queue>
#include<map>
#define LL long long
#define il inline
#define re register

using namespace std;
const LL mod=1000000007;
il LL rd()
{
    re LL x=0,w=1;re char ch;
    while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
    return x*w;
}
int prm[200010],pp[1000010],tt,n;   //pp为某个数的最小质因子
LL ans=1,an[1000010];

int main()
{
  n=rd();
  for(int i=2;i<=n;i++)
    {
      if(!pp[i]) pp[i]=i,prm[++tt]=i;
      for(int j=1;j<=tt&&i*prm[j]<=n;j++)
        {
          pp[i*prm[j]]=prm[j];
          if(i%prm[j]==0) break;
        }
      int x=i;
      while(x>1)
        {
          ++an[pp[x]];
          x/=pp[x];
        }
    }
  for(int i=1;i<=n;i++) ans=(ans*((an[i]<<1)|1))%mod;
  printf("%lld\n",ans);
  return 0;
}

posted @ 2018-08-01 19:43  ✡smy✡  阅读(126)  评论(0编辑  收藏  举报