luogu P1445 [Violet]嘤F♂A

Posted smyjr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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(kin 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
",ans);
  return 0;
}

以上是关于luogu P1445 [Violet]嘤F♂A的主要内容,如果未能解决你的问题,请参考以下文章

P1445 [Violet]樱花(质因数分解)

P1445 [Violet]樱花

Copy自某谷题解P1445 [Violet]樱花

Luogu4168 [Violet]蒲公英

题解luogu4168 [Violet]蒲公英

[Luogu4169][Violet]天使玩偶/SJY摆棋子