题目大意

有函数\(f(x)\),\(f(0)=0,f(1)=1,f(x)=f(x-1)+f(x-2)\)
\(t\)(\(t\leq1000\))组询问,每次给定\(n,m\)(\(n,m\leq10^6\)),求:
\[\prod_{i=1}^{n}\prod_{j=1}^{m}f(gcd(i,j))\]

题解

这个人(点这里)讲得很清楚\(\color{white}{\text{shing太强了}}\)
假设\(n\)是\(n,m\)中较小的那个,讲一些在得出答案\(=\prod_{d=1}^{n}f(d)^{\sum_{k=1}^{\lfloor \frac{n}{d}\rfloor}{\mu(k)\lfloor \frac{n}{dk}\rfloor\lfloor \frac{m}{dk}\rfloor}}\)之后的事
设\(p=dk\)则有答案\(=\prod_{d=1}^{n}f(d)^{\sum_{d\mid p}^{n}{\mu(\frac{p}{d})\lfloor \frac{n}{p}\rfloor\lfloor \frac{m}{p}\rfloor}}\)
把幂次上的\(\sum\)拿下来变成\(\prod\),答案\(=\prod_{d=1}^{n}\prod_{d\mid p}^{n}f(d)^{{\mu(\frac{p}{d})\lfloor \frac{n}{p}\rfloor\lfloor \frac{m}{p}\rfloor}}=\prod_{d=1}^{n}(\prod_{d\mid p}^{n}f(d)^{\mu(\frac{p}{d})} )^{\lfloor \frac{n}{p}\rfloor\lfloor \frac{m}{p}\rfloor}\)
括号里的部分\(g(d)=\prod_{d\mid p}^{n}f(d)^{\mu(\frac{p}{d})}\)与\(n,m\)无关可以预处理,将每个\(f(a)^{\mu(b)}\)乘到\(g(a*b)\),预处理的时间复杂度为\(\frac{n}{1}+\frac{n}{2}+\frac{n}{3}+...+\frac{n}{n}\),大约是\(n*log n\)
接下来数论分块计算\(\prod_{d=1}^{n}g(d)^{\lfloor \frac{n}{p}\rfloor\lfloor \frac{m}{p}\rfloor}\)就行了,这部分的时间复杂度是\(\Theta(T(\sqrt n +\sqrt m))\)

代码
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<iomanip>
#include<iostream>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define rep(i,x,y) for(register int i=(x);i<=(y);++i)
#define dwn(i,x,y) for(register int i=(x);i>=(y);--i)
#define maxn 1000010
#define lim 1000000
#define LL long long
using namespace std;
int read()
{int x=0,f=1;char ch=getchar();while(!isdigit(ch)&&ch!='-')ch=getchar();if(ch=='-')f=-1,ch=getchar();while(isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();return x*f;
}
void write(int x)
{if(x==0){putchar('0'),putchar('\n');return;}int f=0;char ch[20];if(x<0)putchar('-'),x=-x;while(x)ch[++f]=x%10+'0',x/=10;while(f)putchar(ch[f--]);putchar('\n');return;
}
const LL mod=1e9+7;
int n,m,t,f[maxn],pf[maxn],g[maxn],pg[maxn],p[maxn],no[maxn],cnt,mu[maxn];
int mul(int x,LL y){int res=1;while(y){if(y&1ll)res=(LL)res*(LL)x%mod;x=(LL)x*(LL)x%mod,y>>=1;}return res;}
int main()
{no[1]=mu[1]=1;rep(i,2,lim){if(!no[i])p[++cnt]=i,mu[i]=-1;for(int j=1;j<=cnt&&i*p[j]<=lim;j++){no[i*p[j]]=1;if(i%p[j]==0){mu[i*p[j]]=0;break;}else mu[i*p[j]]=-mu[i];}}f[1]=pf[1]=g[1]=1;rep(i,2,lim)f[i]=(f[i-1]+f[i-2])%mod,pf[i]=mul(f[i],mod-2),g[i]=1;rep(i,1,lim){for(int j=i;j<=lim;j+=i){if(mu[j/i]==1)g[j]=(LL)g[j]*(LL)f[i]%mod;else if(mu[j/i]==-1)g[j]=(LL)g[j]*(LL)pf[i]%mod;}}g[0]=pg[0]=1;rep(i,1,lim)g[i]=(LL)g[i-1]*(LL)g[i]%mod,pg[i]=mul(g[i],mod-2);t=read();while(t--){n=read(),m=read();if(n>m)swap(n,m);int ans=1;for(int l=1,r=0;l<=n;l=r+1){r=min(n/(n/l),m/(m/l));ans=(LL)ans*mul((LL)g[r]*(LL)pg[l-1]%mod,(LL)(n/l)*(LL)(m/l))%mod;}write(ans);}return 0;
}

转载于:https://www.cnblogs.com/xzyf/p/10443257.html

并不对劲的bzoj4816:loj2000:p3704[SDOI2017]数字表格相关推荐

  1. SDOI2017 数字表格

    SDOI2017 数字表格 题意: 题目传送门 题解: 答案的式子大致是这样的: \[\prod_{i = 1} ^ n \prod_{j = 1} ^ m f_{gcd(i, j)}\] 然后大力反 ...

  2. [bzoj4816][Sdoi2017]数字表格 (反演+逆元)

    (真不想做莫比乌斯了) 首先根据题意写出式子 ∏(i=1~n)∏(j=1~m)f[gcd(i,j)] 很明显的f可以预处理出来,解决 根据套路分析,我们可以先枚举gcd(i,j)==d ∏(d=1~n ...

  3. 【bzoj4816】[Sdoi2017]数字表格

    题目链接 Description Doris刚刚学习了fibonacci数列.用f[i]表示数列的第i项,那么 f[0]=0 f[1]=1 f[n]=f[n-1]+f[n-2],n>=2 Dor ...

  4. 「luogu3704」[SDOI2017]数字表格

    莫比乌斯反演,其中一些处理比较套路 1 #include<bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 co ...

  5. [SDOI2017]数字表格

    题目描述 Doris刚刚学习了fibonacci数列.用$f[i]$ 表示数列的第$i$ 项,那么 $f[0]=0$ ,$f[1]=1$ , $f[n]=f[n-1]+f[n-2],n\geq 2$ ...

  6. BZOJ 4816 [Sdoi2017]数字表格

    题目链接 https://lydsy.com/JudgeOnline/problem.php?id=4816 题解 反演 ∏T=1min⁡(n,m)(∏d∣Tfib(d)μ(d))⌊n/d⌋⌊m/d⌋ ...

  7. BZOJ 4816[SDOI2017]数字表格(莫比乌斯反演)

    题目链接 \(Description\) 用\(f_i\)表示\(fibonacci\)数列第\(i\)项,求\(\prod_{i=1}^{n}\prod_{j=1}^{m}f[gcd(i,j)]\) ...

  8. BZOJ 2154 [国家集训队]Crash的数字表格 / JZPTAB(莫比乌斯反演,经典好题)(Luogu P1829)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P1829 [国家集训队]Crash的数字表格 / JZPTAB(反演,经典好题) Problem S ...

  9. bzoj2154 Crash的数字表格

    2154: Crash的数字表格 Time Limit: 20 Sec  Memory Limit: 259 MB Submit: 4549  Solved: 1643 [Submit][Status ...

最新文章

  1. apu和atom处理器两者的定位
  2. Python字典的排序方法,你用对了吗
  3. C语言实现Dijkstra(迪杰斯特拉)算法(附完整源码)
  4. webpack-plugin-webpack.DefinePlugin-应用全局变量,svn-rep-browser
  5. 图数据库与关系数据库的实验对比——意大利商会 InfoCamere 案例
  6. PHP扩展详解(一)
  7. ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule
  8. Illustrator 教程,如何在 Illustrator 中使用图层组织内容?
  9. Vue项目中直接调用打印机打印网页的某一区域的方法
  10. 【算法专题】链表排序算法总结
  11. Echarts堆叠柱状图显示百分比
  12. MacW小编分享设计师们常用Sketch插件合集,让你效率翻倍!
  13. 119.编写函数,该函数的功能是计算下列级数之和,和值返回调用函数,数据由主函数输入
  14. Bootstrap3 Font Awesome 字体图标的基本图标
  15. 2021-05-02 收心继续
  16. VC助手 Visual Assist 6.0的安装与简介
  17. DB2 SQL消息查询
  18. 白鹭小游戏-成语挑战-资源放置
  19. linux mv命令的功能,linux常用命令:Linux常用命令之mv命令是什么?
  20. 一键装机tomcat脚本

热门文章

  1. 如何将python项目部署到服务器_部署python项目到linux服务器
  2. 使用游标显示销售报表_协助报表开发之 MongoDB join mysql
  3. java 怎么判断1_1.0_1.00是同一个数_php如何优雅的判断 0.0/0.00/0.000 是否为空? 测试过用empty函数不行...
  4. java excel转word表格_java利用poi生成/读取excel表格、生成word
  5. linux如何编译php扩展,linux环境下编译php扩展
  6. ajax后台重定向会返回什么_第三十五天JavaScript中的ajax
  7. django mysql connector,MySQL Connector / Python作为Django引擎?
  8. mysql的原理图解_MySQL排序工作原理
  9. 个人博客代码_Solo小众开源博客系统:手把手教你搭建自己的博客系统
  10. 传统的6d位姿估计fangfa1_你的厨房被水淹了!别担心,这只是3D深度估计做出的特效...