BZOJ_2721_[Violet 5]樱花_数学

Description

Input

Output



$\frac{1}{x}+\frac{1}{y}=\frac{1}{m}$

$xm+ym=xy$

$(x-m)*(y-m)=m^{2}$

于是转化为了求$n!$的约数个数

可以用每个质因子搞一下

代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <stdlib.h>
using namespace std;
#define N 1000050
typedef long long ll;
int n,prime[N],cnt;
bool vis[N];
ll ans,mod=1000000007;
int main() {
    ll i,j;
    ans=1;
    scanf("%d",&n);
    for(i=2;i<=n;i++) {
        if(!vis[i]) {
            prime[++cnt]=i;
            int tmp=n,r=0;
            //while(tmp) r+=tmp/i,tmp/=i;
            for(j=i;j>=i&&j<=n;j*=i) {
                r+=n/j;
            }
            ans=ans*(2*r+1)%mod;
        }
        for(j=1;j<=cnt&&i*prime[j]<=n;j++) {
            vis[i*prime[j]]=1;
            if(i%prime[j]==0) break;
        }
    }
    printf("%lld\n",ans);
}

原文地址:https://www.cnblogs.com/suika/p/8967169.html

时间: 2024-08-30 12:29:24

BZOJ_2721_[Violet 5]樱花_数学的相关文章

C语言_数学(1)___统计问题(Hdu 2563)

Problem Description 在一无限大的二维平面中,我们做如下假设: 1.  每次只能移动一格: 2.  不能向后走(假设你的目的地是"向上",那么你可以向左走,可以向右走,也可以向上走,但是不可以向下走): 3.  走过的格子立即塌陷无法再走第二次: 求走n步不同的方案数(2种走法只要有一步不一样,即被认为是不同的方案). Input 首先给出一个正整数C,表示有C组测试数据 接下来的C行,每行包含一个整数n (n<=20),表示要走n步. Output 请编程输出

B20J_4027_[HEOI2015]兔子与樱花_树形DP

题意: 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1个树枝连接,我们可以把它看成一个有根树结构,其中0号节点是根节点.这个树的每个节点上都会有一些樱花,其中第i个节点有c_i朵樱花.樱花树的每一个节点都有最大的载重m,对于每一个节点i,它的儿子节点的个数和i节点上樱花个数之和不能超过m,即son(i) + c_i <= m,其中son(i)表示i的儿子的个数,如果i为叶子节点

[bzoj4027][HEOI2015]兔子与樱花_贪心_树形dp

兔子与樱花 bzoj-4027 HEOI-2015 题目大意:每个点有c[i]朵樱花,有一个称重m, son[i]+c[i]<=m.如果删除一个节点,这个节点的樱花或移动到它的祖先中深度最大的,且没有被删除的节点,求在满足所有点界限的情况下,最多能删除的节点数. 注释:$1\le n\le 2\cdot 10^6$,$1\le m\le 10^5$,$0\le c_i\le 1000$. 想法:开始的时候很容易想到贪心,但是这东西对不对还两说 其实仔细一想这玩意儿tm显然啊??! 我们令c[i]

Python内置函数_数学运算类

本文和大家分享的主要是python内置函数数据运算类相关内容,一起来看看吧,希望对大家学习python 有所帮助. abs abs(x) 求绝对值 · X可以是整型,也可以是复数 · 若X是复数,则返回复数的模 >>> abs(-1)1>>> abs(-3+4j)5.0>>> bin bin(x) 将整数x转换为二进制字符串 >>> bin(2)'0b10'>>> bin(3)'0b11' bool bool([x]

【筛法求素数】【质因数分解】bzoj2721 [Violet 5]樱花

http://www.cnblogs.com/rausen/p/4138233.html #include<cstdio> #include<iostream> using namespace std; #define MOD 1000000007 int n; bool Not[1000001]; int pr[1000001],e,ci[1000001]; void shai() { Not[1]=1; for(int i=2;i<=1000;++i) if(!Not[i

2721: [Violet 5]樱花|约数个数

先跪一发题目背景QAQ 显然x,y>n!,然后可以设y=n!+d 原式子可以化简成 x=n!2d+n! 那么解的个数也就是n!的因子个数,然后线性筛随便搞一搞 #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<queue> #include<vector> #include<set> #include<ma

BZOJ2721 [Violet 5]樱花

先令n! = a: 1 / x + 1 / y = 1 / a  =>  x = y * a / (y - a) 再令 k = y - a: 于是x = a + a ^ 2 / k  =>  k | a ^ 2 故等价于求a ^2的约数个数 素数筛一下什么的就好了嘛 1 /************************************************************** 2 Problem: 2721 3 User: rausen 4 Language: C++ 5

【bzoj2721】[Violet 5]樱花 数论

题目描述 输入 输出 样例输入 2 样例输出 3 题解 数论 设1/x+1/y=1/m,那么xm+ym=xy,所以xy-xm-ym+m^2=m^2,所以(x-m)(y-m)=m^2. 所以解的数量就是m^2的约数个数. 所以只需要算出n!中每个素数的出现次数即可. 我们可以先快筛出1~n的素数,然后考虑每个素数出现的次数. 而p出现的次数为包含p^1的数的个数+包含p^2的数的个数+...+包含p^k的数的个数,我们可以迭代来求. 最后把它们乘2加1再乘到一起即可. #include <cstd

BZOJ 2721 Violet 5 樱花 数论

题目大意:给定n,求有多少正整数数对(x,y)满足1x+1y=1n! 由于x,y>0,故显然有y>n! 不妨设y=n!+t(t>0),那么有 1x+1n!+t=1n! 化简后得到 n!(n!+t)+x(n!)=x(n!+t) x=(n!)2t+n! 故答案为d((n!)2) #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #defin