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;
}

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

时间: 2024-08-30 18:00:35

luogu P1445 [Violet]嘤F♂A的相关文章

[Luogu P4168] [Violet]蒲公英 (分块)

题面 洛咕 Solution 题目要求求出区间众数,强制在线. 区间众数是一个比较尴尬的问题,我们无法用区间数据结构来处理这个问题,因为我们没法很好的合并区间众数的答案. 既然区间数据结构解决不了这个问题,我们可以考虑一下使用基于分块的算法,例如莫队. 这题用莫队非常好处理,不幸的是,这题要求强制在线. 因此我们考虑使用分块算法. 分块算法的核心在于把一整个块的信息压缩起来以便快速处理. 我们要查询一段区间的众数,我们可以考虑这样搞:对于这个区间内连续的块,我们先快速地查询这个连续的块中的众数,

解题报告:luogu P1445

题目链接:P1445 [Violet]樱花 数学题真的不会了,只推出了浅显的一步,真的菜. 易得到: \[xy=(x+y)n! \] 移项然后两边同时间上\((n!)^2\),构造平方数: \[(n!)^2=(n!)^2+(x+y)n!-xy \] 右边十字相乘因式分解: \[(n!)^2=(n!-x)(n!-y) \] 设\(a=n!-x,b=n!-y\),那么: \[(n!)^2=ab \] 显然\(a,b\)为\((n!)^2\)的因子,且\(a,b\)与\(x,y\)一一对应,那么我们只

Luogu P4168 [Violet]蒲公英

P4168 [Violet]蒲公英 题意 题目背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多小朋友也被它杀掉了.我觉得把那么可怕的怪物召唤出来的那个坏蛋也很坏呢.不过奶奶说他是很难受的时候才做出这样的事的-- 最近村子里长出了一大片一大片的蒲公英.一刮风,这些蒲公英就能飘到好远的地方了呢.我觉得要是它们能飘到那个城市里面,让哥哥看看就好了呢! 哥哥你要快点回来哦! 爱你的妹妹 \(V

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

传送门 二维平面修改+查询,cdq分治可以解决. 求关于某个点曼哈顿距离(x,y坐标)最近的点——dis(A,B) = |Ax-Bx|+|Ay-By| 但是如何去掉绝对值呢? 查看题解发现假设所有的点都在查询点的左下方,dis(A,B) = (Ax-Bx)+(Ay-By) = (Ax+Ay)-(Bx+By) 只要求满足Bx<Ax,By<Ay且Bx,By之和最大的点就好了. 那么如何把所有的点转化到该查询的左下呢? 对于每个查询,可以把一.二.四象限的点都通过对称转移到第三象限.但查询很多,不可

帝都 Day3(by rqj)

备注:Day1 Day2记得笔记太233,所以就不发了 备注2:Day4~Day7发不发看心情qaq (7.17持续更新中...) 动态规划A 记忆化搜索 & 动态规划初步 8点15: 杨姓dalao唠叨了几句:8点20:上课正式开始 part1 记忆化搜索 数字金字塔:luogu 1216 一.搜索(dfs) 没一个点向左或向右走 void dfs(int x,int y,int val) { val+=a[x][y]; if(x==n-1) { if(val>ans)ans=val; r

WC2018 州区划分

题目描述: luogu 题解: 设$f[S]$表示选集合$S$时所有满意度乘积之和,$W[S]$表示集合$S$中选中的$w$之和.显然有这样一个式子:$$f[S]= \frac{1}{W[S]^p} \sum\limits_{T \subseteq S}f[T]*W[S-T]^p*[check(S-T)]$$ 后面$check$的意思是判断$S-T$是否合法. 原题义中不合法的条件是存在一条欧拉回路.那么: 若图不连通则不存在. 若一个点的度数是奇数则不存在 单个点一定存在 这样可以$O(2^n

过分过分进货价获国家

http://f.dangdang.com/group/24554/3491082/http://f.dangdang.com/group/24554/3491087/http://f.dangdang.com/group/24554/3491094/http://f.dangdang.com/group/24554/3491099/http://f.dangdang.com/group/24554/3491105/http://f.dangdang.com/group/24554/349111

我们找个地方看好戏

http://v.qq.com/page/f/y/4/m041433ssun.html http://v.qq.com/page/f/y/4/m041433ssun.html http://v.qq.com/page/f/y/4/m04143o3lhg.html http://v.qq.com/page/f/y/4/m04144675h3.html http://v.qq.com/page/f/y/4/m04144k1k1j.html http://v.qq.com/page/f/y/4/m04

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

做了题还是忍不住要写一发题解,感觉楼下的不易懂啊. 本题解使用latex纯手写精心打造. 题意:求\(\frac{1}{x}+\frac{1}{y}=\frac{1}{n!}\)的正整数解总数. 首先,不会线筛素数的先去做下LuoguP3383. 开始推导. \[\frac{1}{x}+\frac{1}{y}=\frac{1}{n!}\] 那么\(\frac{1}{x}\)和\(\frac{1}{y}\)肯定是小于\(\frac{1}{n!}\)的.所以\(x\)和\(y\)肯定都是大于\(n!