码迷,mamicode.com
首页 > 其他好文 > 详细

luogu P1445 [Violet]嘤F♂A

时间:2018-08-01 20:51:44      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:str   约数个数   mes   span   vector   开始   tchar   博文   inline   

博主决定更博文啦


这道题一开始没什么思路啊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;
}

luogu P1445 [Violet]嘤F♂A

标签:str   约数个数   mes   span   vector   开始   tchar   博文   inline   

原文地址:https://www.cnblogs.com/smyjr/p/9403543.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!