题面

题解

这道题目还有一种比较有意思的解法。

定义一种运算\((\mathbf f\oplus\mathbf g)(x) = \prod\limits_{d\mid x}\mathbf f(d)^{\mathbf g(\frac xd)}\)

研究一下这种运算的性质:

虽然这个运算没有交换律也没有结合律,但是它有一个比较奇特的性质:

设运算\(*\)是狄利克雷卷积,那么可以证明\((\mathbf f \oplus \mathbf g) \oplus \mathbf h = \mathbf f \oplus (\mathbf g * \mathbf h)\)。

于是就有一种基于\(\prod\)的莫比乌斯反演:

\(\mathbf f = \mathbf g \oplus \mathbf 1 \Rightarrow \mathbf g = \mathbf f \oplus \mu\)

也就是\(\mathbf f(x) = \prod_{d|x} \mathbf g(d) \Rightarrow \mathbf g(x) = \prod_{d|x} \mathbf f(d)^{\mu(\frac xd)}\)

那么这道题目就很好推了。

\[\begin{aligned}
&\prod_{i=1}^n\prod_{j=1}^m f[\gcd(i, j)] \\
=&\prod_{i=1}^n\prod_{j=1}^m\prod_{d|i, d|j} \mathbf g(d) \quad (\mathbf g = \mathbf f \oplus \mu) \\
=&\prod_{d=1}^n \mathbf g(d)^{\sum_{d|i}\sum_{d|j}1} \\
=&\prod_{d=1}^n \mathbf g(d)^{\left\lfloor \frac nd\right\rfloor \left\lfloor \frac md\right\rfloor}
\end{aligned}
\]

我们发现\(\mathbf g\)可以\(\mathrm{O}(n\log n)\)算,于是就做完了。

代码

这个代码貌似很古老了QAQ

  1. #include<bits/stdc++.h>
  2. #define RG register
  3. #define clear(x, y) memset(x, y, sizeof(x));
  4. using namespace std;
  5. inline int read()
  6. {
  7. int data=0, w=1;
  8. char ch=getchar();
  9. while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
  10. if(ch=='-') w=-1, ch=getchar();
  11. while(ch>='0'&&ch<='9') data=(data<<3)+(data<<1)+(ch^48), ch=getchar();
  12. return data*w;
  13. }
  14. const int mod(1e9+7), maxn(1e6+10), lim(1e6);
  15. inline int fastpow(int x, int y)
  16. {
  17. int ans=1;
  18. while(y)
  19. {
  20. if(y&1) ans=1ll*ans*x%mod;
  21. x=1ll*x*x%mod; y>>=1;
  22. }
  23. return ans;
  24. }
  25. int f[maxn], prime[maxn], g[maxn], cnt, inv, sum[maxn], mu[maxn], n, m, T;
  26. bool not_prime[maxn];
  27. inline void init()
  28. {
  29. not_prime[1]=f[1]=g[1]=sum[0]=sum[1]=mu[1]=1;
  30. for(RG int i=2;i<=lim;i++)
  31. {
  32. f[i]=(f[i-1]+f[i-2])%mod;
  33. g[i]=fastpow(f[i], mod-2);
  34. sum[i]=1;
  35. if(!not_prime[i]) prime[++cnt]=i, mu[i]=-1;
  36. for(RG int j=1;j<=cnt && i*prime[j]<=lim;j++)
  37. {
  38. not_prime[i*prime[j]]=true;
  39. if(i%prime[j]) mu[i*prime[j]]=-mu[i];
  40. else break;
  41. }
  42. }
  43. for(RG int i=1;i<=lim;i++)
  44. {
  45. if(!mu[i]) continue;
  46. for(RG int j=i;j<=lim;j+=i)
  47. sum[j]=1ll*sum[j]*((~mu[i])?f[j/i]:g[j/i])%mod;
  48. }
  49. for(RG int i=1;i<=lim;i++) sum[i]=1ll*sum[i]*sum[i-1]%mod;
  50. }
  51. int main()
  52. {
  53. init();
  54. T=read();
  55. while(T--)
  56. {
  57. n=read(); m=read();
  58. if(n>m) swap(n, m);
  59. RG int i=1, j, k, l, tmp, ans=1;
  60. while(i<=n)
  61. {
  62. k=n/i; l=m/i;
  63. j=min(n/k, m/l);
  64. tmp=1ll*sum[j]*fastpow(sum[i-1], mod-2)%mod;
  65. ans=1ll*ans*fastpow(tmp, 1ll*k*l%(mod-1))%mod;
  66. i=j+1;
  67. }
  68. printf("%d\n", (ans+mod)%mod);
  69. }
  70. return 0;
  71. }

【SDOI2017】数字表格的更多相关文章

  1. BZOJ:4816: [Sdoi2017]数字表格

    4816: [Sdoi2017]数字表格 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 501  Solved: 222[Submit][Status ...

  2. [Sdoi2017]数字表格 [莫比乌斯反演]

    [Sdoi2017]数字表格 题意:求 \[ \prod_{i=1}^n \prod_{j=1}^m f[(i,j)] \] 考场60分 其实多推一步就推倒了... 因为是乘,我们可以放到幂上 \[ ...

  3. 【BZOJ 4816】 4816: [Sdoi2017]数字表格 (莫比乌斯)

    4816: [Sdoi2017]数字表格 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 666  Solved: 312 Description Do ...

  4. P3704 [SDOI2017]数字表格

    P3704 [SDOI2017]数字表格 链接 分析: $\ \ \ \prod\limits_{i = 1}^{n} \prod\limits_{j = 1}^{m} f[gcd(i, j)]$ $ ...

  5. [SDOI2017]数字表格 --- 套路反演

    [SDOI2017]数字表格 由于使用markdown的关系 我无法很好的掌控格式,见谅 对于这么简单的一道题竟然能在洛谷混到黑,我感到无语 \[\begin{align*} \prod\limits ...

  6. 题解-[SDOI2017]数字表格

    题解-[SDOI2017]数字表格 前置知识: 莫比乌斯反演</> [SDOI2017]数字表格 \(T\) 组测试数据,\(f_i\) 表示 \(\texttt{Fibonacci}\) ...

  7. [SDOI2017]数字表格 & [MtOI2019]幽灵乐团

    P3704 [SDOI2017]数字表格 首先根据题意写出答案的表达式 \[\large\prod_{i=1}^n\prod_{j=1}^mf_{\gcd(i,j)} \] 按常规套路改为枚举 \(d ...

  8. bzoj4816 [Sdoi2017]数字表格

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

  9. [SDOI2017]数字表格

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

  10. 【刷题】BZOJ 4816 [Sdoi2017]数字表格

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

随机推荐

  1. js调用android本地java代码

    js调用android本地java代码 当在Android上使用WebView控件开发一个Web应用时,可以创建一个通过Javascript调用Android端java代码的接口.也就是可以通过Jav ...

  2. (后端)org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1,actual 0

    两种方案: 用queryForList方法替换queryForObject或者queryForMap,因为这两个方法必须要有值,不能为空. 把这个异常捕获,用try/catch. 这个查询的结果是nu ...

  3. [20170825]11G备库启用DRCP连接3.txt

    [20170825]11G备库启用DRCP连接3.txt --//昨天测试了11G备库启用DRCP连接,要设置alter system set audit_trail=none scope=spfil ...

  4. Asp.Net WebApi Get请求整理(一)

    Asp.Net WebApi+JQuery Ajax的Get请求整理 一.总结 1.Asp.Net WebApi默认不支持Get请求,需要在Action方法上指定[HttpGet], 除非Action ...

  5. Sql Server 判断字符串是否可以转数字

    主要是在sql server的内置系统函数ISNUMERIC的基础上,将例外的“+”.“-”.“$”等也进行判断. CREATE FUNCTION [dbo].[fn_IsNumberic]( @st ...

  6. 弱符号__attribute__((weak))

    弱符号是什么? 弱符号: 若两个或两个以上全局符号(函数或变量名)名字一样,而其中之一声明为weak symbol(弱符号),则这些全局符号不会引发重定义错误.链接器会忽略弱符号,去使用普通的全局符号 ...

  7. nginx配置基于域名、端口、IP的虚拟主机

    1.基于域名的虚拟主机: 绝大多数企业对外提供服务的网站使用的都是基于域名的主机,通过不同的域名区分不同的虚拟主机. 首先我们进入安装nginxd的目录下:/application/nginx-1.6 ...

  8. VSCode + PYQT5 + QtDesigner 环境搭建和测试

    目的:编写Python桌面应用程序. 备注:也可以选择VS2017+QtDesigner ,但更喜欢VSCode 第1步:安装PyQt5和PyQt5-tools pip3 install -i htt ...

  9. 【微信JSSDK】PHP版微信录音文件下载

    微信的录音文件上传到微信服务器上,只能保存三天. 因此需要做一个转存到自己服务器,或者七牛云的操作. 转存到自己服务器 调用微信JSSDK API 录音, 录音结束,上传到微信服务器,获取录音文件的 ...

  10. JDK动态代理源码解析

    动态代理.静态代理优缺点     关于JDK的动态代理,最为人熟知的可能要数Spring AOP的实现,默认情况下,Spring AOP的实现对于接口来说就是使用的JDK的动态代理来实现的,而对于类的 ...