牛牛的幂运算

链接:https://ac.nowcoder.com/acm/problem/21578
来源:牛客网

题目描述
牛牛在做一道数学题,他发现自己不怎么会做,请你帮帮他
求有多少a,b,c,d满足ab = cd, 1<=a,b,c,d<=n, 模 109+7
输入描述:
输入一个整数n (1 ≤ n ≤ 109)
输出描述:
输出一个整数
示例1
输入
2
输出
6
示例2
输入
100
输出
21620
示例3
输入
22306
输出
68467
备注:
子任务一30分:n<=10000
子任务二30分:n<=1000000
子任务三40分:n<=1000000000

题意
中文题

题解
做法是看了题解和代码才知道思路的.但是我还是厚着脸皮的决定写下这篇博客。
因为这道题是我几个月前就看到了,但是一直不知道怎么做,也问了人,也没有解决。然后昨天又看到了这个题,决定补上它。题解来自EOJ,19年5月份月赛,那道题和这题基本一样。只不过那道题是 a m a x , b m a x , c m a x , d m a x a_{max},b_{max},c_{max},d_{max} amax​,bmax​,cmax​,dmax​

最好计算的就是 a = c , b = d a=c,b=d a=c,b=d或 a = c = 1 a=c=1 a=c=1
当 a = ̸ c a=\not c a≠​c时,我们设 a = x i , c = x j a=x^i,c=x^j a=xi,c=xj,很显然,想要 a b = c d a^b=c^d ab=cd,必须 a , c a,c a,c有同样的底 x x x,并且 i ⋅ b = j ⋅ d i·b=j·d i⋅b=j⋅d。
因此枚举 i , j i,j i,j,显然 g c d ( i , j ) = ̸ 1 gcd(i,j)=\not1 gcd(i,j)≠​1时,会重复计数。由 i , j i,j i,j我们也就可以确定 x x x的数量。随之,我们也确定了有多少 b , d b,d b,d满足 i ⋅ b = j ⋅ d i·b=j·d i⋅b=j⋅d。也就计算出了答案的更新量。

算法解释:
首先我们单独列出 a = c = 1 a=c=1 a=c=1的情况,即 a n s = b ∗ d ans=b*d ans=b∗d
然后两个循环枚举 i , j i,j i,j,对于每个 g c d ( i , j ) = 1 gcd(i,j)=1 gcd(i,j)=1的 i , j i,j i,j,我们都能知道有 M I N ( a m a x i , c m a x j ) MIN(\sqrt[i]{a_{max}},\sqrt[j]{c_{max}}) MIN(iamax​ ​,jcmax​ ​)个 x x x,但是当 x = 1 x=1 x=1时,会出现问题,其实也就是 a = c = 1 a=c=1 a=c=1,这部分也是我们先单独列出的情况,所以事实上x的数量是 M I N ( a m a x i − 1 , c m a x j − 1 ) MIN(\sqrt[i]{a_{max}}-1,\sqrt[j]{c_{max}}-1) MIN(iamax​ ​−1,jcmax​ ​−1),有 M I N ( b / j , d / i ) MIN(b/j,d/i) MIN(b/j,d/i)个等式 i ⋅ b = j ⋅ d i·b=j·d i⋅b=j⋅d成立.

另外需要额外注意的是,while(qpow(aa,i) <= a) aa++; aa--;这个手动补精度。。。不加手动补精度会产生误差,wa(过了98%的数据),所以应该是 1 / i 1/i 1/i产生的精度误差,不知道对不对,只能这么强行解释了

代码

// #include <bits/stdc++.h>
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <queue>
#include <cmath>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <vector>
#include <assert.h>
#include <cmath>
#include <ctime>
using namespace std;
#define me(x,y) memset((x),(y),sizeof (x))
#define MIN(x,y) ((x) < (y) ? (x) : (y))
#define MAX(x,y) ((x) > (y) ? (x) : (y))
#define SGN(x) ((x)>0?1:((x)<0?-1:0))
#define ABS(x) ((x)>0?(x):-(x))
// #define int __int128typedef long long ull;
typedef unsigned long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;const ll maxn = 2010;
const double INF = 0x3f3f3f3f;
const int MOD = 1e9+7;
const double eps = 1e-17;
const double PI = std::acos(-1);ll qpow(ll a,ll b){ll ans = 1;while(b){if(b&1) ans = ans*a;a = a*a;b >>= 1;}return ans;
}int main(){// ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGEfreopen("1in.in","r",stdin);freopen("1out.out","w",stdout);
#endifll a,b,c,d;int n;while(cin>>n){// cin>>a>>b>>c>>d;a = b = c = d = n;ll ans = d*b;for(int i = 1; i <= 32; ++i){for(int j = 1; j <= 32; ++j){if(__gcd(i,j) == 1){ll aa = pow(a,1.0/i);ll cc = pow(c,1.0/j);while(qpow(aa,i) <= a) aa++; aa--;while(qpow(cc,j) <= c) cc++; cc--;ans = (ans+MIN(aa-1,cc-1)*MIN(b/j,d/i))%MOD;}}}cout<<ans<<endl;}return 0;
}

牛牛的幂运算(思维,数学)相关推荐

  1. 快速幂运算(入门完整版)

    快速幂运算 除数学问题之外,也有许多地方用到了幂运算.在此给大家介绍一种能够非常高效的计算幂运算的快速幂运算算法--反复平方法. Carmichael Number 我们把对任意的1<x< ...

  2. 数学运算符 +(加)、-(减)、(乘)、(除)、%(取余;取模)、(整除)、(幂运算)及分支结构

    数学运算符: +(加).-(减).*(乘)./(除).%(取余;取模).//(整除).**(幂运算) 1. +.-.*./ python的加减乘除和小学数学中的加减乘除的功能一样 print(3 + ...

  3. 【数学】幂运算与快速幂取余

    一.幂运算 1.幂的定义: 的幂就是多个相乘,记作,表示的次幂,即个相乘,我们把叫做底数,叫做指数. 2.幂的运算: 我们可以用公式将幂运算进行简化,公式如下: 3.求幂方法: (1). Python ...

  4. 幂运算 数组_Super Pow:如何高效进行模幂运算

    点击上方蓝字设为星标 东哥带你搞定算法~ 今天来聊一道与数学运算有关的算法题目,LeetCode 372 题 Super Pow,让你进行巨大的幂运算,然后求余数. int superPow(int ...

  5. scala怎么做幂运算_Scala幂(幂)函数示例

    scala怎么做幂运算 Scala programming language has a huge set of libraries to support different functionalit ...

  6. python 幂运算 整数_在Python中检查一个数字是否是另一个数字的幂

    python 幂运算 整数 To solve this problem simply, we will use the log() function from the math module. The ...

  7. python的整除运算_Python3基础 ** 幂运算 // 整除运算

    ? ????   Python : 3.7.0 ??????   OS : Ubuntu 18.04.1 LTS ??????  IDE : PyCharm 2018.2.4 ????? Conda ...

  8. JAVA计算平方,幂运算,三角函数等

    JAVA中要想计算一个数值的平方根, 可以使用 sqrt 方法: double x = 4; double y = Math.sqrt(x); System.out.println(y); 在 Jav ...

  9. java计算器gui(有三角函数,幂运算)

    这个是真的简单的计算器,看到网上很多,现学了一些swing,时间紧,自己又菜,这个计算器,有很多限制,只能计算一些特别简单的计算,比如(2+3+4)是不行的,只能2+3,在网上我也看了很多计算器,但是 ...

最新文章

  1. 如何优雅地根治null值引起的Bug!
  2. luogu P1345 [USACO5.4]奶牛的电信Telecowmunication(建图技巧 - “割点”模板 、最小割)
  3. putty改oracle数据库密码,用putty远程访问虚拟机linux系统Oracle数据库。
  4. Spark的transformation和action算子简介
  5. 转载-对js中new、prototype的理解
  6. 自学python转行-转行Python,应该如何短期自学,达到就业水平
  7. Application failure. hr=0x80040101:Failed to initialize virtual machine.
  8. Handler消息处理机制
  9. sql IFNULL
  10. eslint 无法格式化ts_VS Code Prettier + ESlint 格式化Vue代码及遇到问题
  11. 离散图 java,Java实现离散Arnold变换(图像处理)
  12. aptana studio 3支持jquery
  13. C#如何使用httpwebrequest通过代理访问网页
  14. Eclipse REST 库使用
  15. 西瓜书+实战+吴恩达机器学习(十八)降维(主成分分析 PCA)
  16. windows下安装Redis数据库
  17. CardView-卡片布局
  18. dota2服务器选哪个文件,畅爽竞技必看 DOTA2服务器选择指南
  19. windows运行库文件
  20. 偏向锁,轻量级锁,重量级锁的核心原理

热门文章

  1. 关于Android 中的Activity,Application和Task
  2. 【buildroot】buildroot使用笔记-01 | 常规使用步骤
  3. Buildroot OpenJDK 编译配置
  4. 如何使用iMovie为视频添加字幕
  5. CAN总线的终端电阻为什么常用120Ω(一)-CAN总线概述及终端电阻添加要求
  6. java switch 循环_JAVA中的switch循环
  7. Spring MVC调度流程
  8. 专注于自媒体短视频领域四年后的运营问题汇总-第一集
  9. 时间片轮转算法(RR算法)c++ 数组
  10. 随机过程(下):Markov Jump与Kolmogorov equation