首页 > 其他分享 >解题报告 P3704 [SDOI2017] 数字表格

解题报告 P3704 [SDOI2017] 数字表格

时间:2023-10-31 22:37:28浏览次数:30  
标签:lfloor aligned frac sum rfloor P3704 解题 SDOI2017 prod

P3704 [SDOI2017] 数字表格

经典莫反。

题目要求:

\[\prod_{i=1}^n\prod_{j=1}^m fib(\gcd(i,j)) \]

不妨令 \(n<m\)。套路地,我们设 \(\gcd(i,j)=d\),然后枚举 \(d\):

\[\begin{aligned} &\quad\prod_{d=1}^n\prod_{i=1}^n\prod_{j=1}^mfib(d)^{[\gcd(i,j)==d]}\\ &=\prod_{d=1}^nfib(d)^{\sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)==d]} \end{aligned} \]

指数单独提出来

\[\begin{aligned} &\quad\sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)==d]\\ &=\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}[\gcd(i,j)==1] \end{aligned} \]

套路地设

\[f(x)=\sum_{i=1}^{p}\sum_{j=1}^{q}[\gcd(i,j)==x]\\ g(x)=\sum_{x|d}f(d) \]

那么

\[f(x)=\sum_{x|d}\mu(\frac dx)g(d)\\ \Rightarrow f(1)=\sum_{d=1}^p\mu(d)g(d) \]

从含义出发,

\[\begin{aligned} g(x)&=\sum_{i=1}^p\sum_{j=1}^q[x|\gcd(i,j)]\\ &=\sum_{i=1}^{p/x}\sum_{j=1}^{q/x}[1|\gcd(i,j)]\\ &=\lfloor\frac px\rfloor \cdot \lfloor\frac qx\rfloor \end{aligned} \]

所以

\[\begin{aligned} f(1)=\sum_{i=1}^p\mu(i)\cdot\lfloor\frac pi\rfloor\cdot\lfloor\frac qi\rfloor \end{aligned} \]

所以原式即为:

\[\prod_{d=1}^nfib(d)^{\sum_{i=1}^{n/d}\mu(i)\cdot\lfloor\frac pi\rfloor\cdot\lfloor\frac qi\rfloor} \]

对一个确定的 \(d\) ,指数可以 \(O(\sqrt n)\) 做,同时注意到对于 \(n/d\) 也可以套一层整除分块,总复杂度 \(O(\sqrt n\cdot\sqrt n)=O(n)\)。考虑到 \(\sum n\le 10^9\) 与快速幂以及大量取模等操作带来的巨大常数的存在,并不能通过此题。

我们继续观察指数:

\[\prod_{d=1}^nfib(d)^{\sum_{i=1}^{n/d}\mu(i)\cdot\lfloor\frac n{id}\rfloor\cdot\lfloor\frac m{id}\rfloor} \]

令 \(T=id\):

\[\begin{aligned} &\quad \prod_{T=1}^n\left(\prod_{d|T}fib(d)^{\mu(\frac Td)} \right)^{\lfloor\frac nT \rfloor\cdot\lfloor\frac mT\rfloor}\\ \end{aligned} \]

外面这一块可以整除分块,里面可以 \(O(n\log n)\) 预处理。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N=1e6+10,mod=1e9+7;

ll fpow(ll a,ll k)
{
	ll res=1;
	while(k)
	{
		if(k&1) res=(res*a)%mod;
		a=(a*a)%mod;
		k>>=1;
	}
	return res%mod;
}

ll p[N],mu[N],tot=0,fib[N],infib[N];
ll F[N],inF[N];
bool mp[N];
void init(ll n)
{
	fib[1]=1; infib[0]=1;
	for(int i=2;i<=n;i++) fib[i]=(fib[i-1]+fib[i-2])%mod,F[i]=1;
	for(int i=1;i<=n;i++) infib[i]=fpow(fib[i],mod-2);
	mu[1]=1;
	for(ll i=2;i<=n;i++)
	{
		if(!mp[i]) p[++tot]=i,mu[i]=-1;
		for(int j=1;p[j]*i<=n;j++)
		{
			ll tmp=p[j]*i;
			mp[tmp]=1;
			if(i%p[j]==0)
			{
				mu[tmp]=0;
				break;
			}
			mu[tmp]=mu[i]*(-1);
		}
	}

	F[0]=F[1]=1;
	for(int i=1;i<=n;i++)//求中间那一坨
	{
		if(mu[i]==0) continue;
		for(int T=i;T<=n;T+=i)
			F[T]=(F[T]*(mu[i]==1?fib[T/i]:infib[T/i]))%mod;
	}
	for(int i=2;i<=n;i++) F[i]=(F[i]*F[i-1])%mod;//前缀积
	for(int i=0;i<=n;i++) inF[i]=fpow(F[i],mod-2);//逆元
}

int main()
{
	int t;
	scanf("%d",&t);
	init(N-10);
	while(t--)
	{
		ll n,m;
		scanf("%lld%lld",&n,&m);
		ll minn=min(n,m),ans=1;
		for(ll l=1,r;l<=minn;l=r+1)
		{
			r=min(minn,min(n/(n/l),m/(m/l)));
			ll rev=F[r]*inF[l-1]%mod;
			ans=(ans*fpow(rev,(n/l)*(m/l)%(mod-1)))%mod;
		}
		printf("%lld\n",ans%mod);
	}
	return 0;
}

标签:lfloor,aligned,frac,sum,rfloor,P3704,解题,SDOI2017,prod
From: https://www.cnblogs.com/IzayoiMiku/p/17801773.html

相关文章

  • 《AT_abc326_g Unlock Achievement》解题报告
    考场上压根没想到网络流,感觉这题是做过的网络流里算质量比较高的了。首先我们肯定是想直接贪心,但是发现怎么贪心都没办法,而且数据范围非常小,一般数据范围非常小,且贪心不了但又只能贪心的题就用网络流实现。考虑如何建模,首先我们发现权值有正有负,考虑最大权闭合子图,正权值连汇点,......
  • 「解题报告」2023-10-30 模拟赛
    1.ABBA企鹅豆豆拿到了一个\(N\timesM\)的矩阵,每个位置要么是\(A\)要么是\(B\)。他希望尽可能少的改变里面的字(即\(A\)变\(B\)或者\(B\)变\(A\))使得这个矩阵有至少\(R\)行是回文串,以及至少\(C\)列是回文串,现在他想知道自己需要的最少操作次数。枚举哪些行和哪......
  • 《 $P5642$ 人造情感 》解题报告
    究极套路题,挺有意思的\(qwq\)。首先我们记一些东西。记\(f(x)\)为\(x\)子树中选出的不交路径权值和最大是多少。记\(g(x)\)为\(x\)子树外的不交路径权值和最大是多少。如果有了这两个东西那么答案就很好计算了。那么\(f(1)\)实际上就是\(W(U)\)。\(----------......
  • Codeforces Round#905 解题报告
    按理来说最近开始了一天一套div2计划,第一天做了一套Div1,第二天做了hustfc,第三天因为要赶latex期末考试,所以什么也没做。明天写一下hustfc比较牛的几题。A暴力怎么做,是不是加加加,然后判断。B本质上是让长度为\(i\)的后缀全是\(0\)那么找到最短的有\(i\)个\(0\)......
  • 「解题报告」Codeforces Round 653 (Div. 3)
    A.RequiredRemainderYouaregiventhreeintegers\(x,y\)and\(n\).Yourtaskistofindthemaximuminteger\(k\)suchthat\(0\lek\len\)that\(k\bmodx=y\),where\(\bmod\)ismodulooperation.Manyprogramminglanguagesusep......
  • Codeforces Round#905 解题报告
    由于是解题报告不是过题报告,所以理所当然的放弃了后三题代码的写。感觉这场Div1D是cyh的菜,E是gjk的菜。我负责菜。只写Div1题的题解。A双指针可以做\(m=1\)你发现随便换\(a_1\)答案最多减少\(1\),而且\(a_1\)越趋向于减少,所以可以二分分割点B最短路,怎么dij......
  • 「解题报告」Codeforces Round 905 (Div. 3)
    A.MorningYouaregivenafour-digitpincodeconsistingofdigitsfrom\(0\)to\(9\)thatneedstobeentered.Initially,thecursorpointstothedigit\(1\).Inonesecond,youcanperformexactlyoneofthefollowingtwoactions:Pressthecu......
  • 一道理解题意的题目
    这道题目的意思是是小数部分大于0.5直接进位,小于0.5直接舍弃,等于0.5看整数部分是奇数还是偶数(重点:舍弃直接看小数点后的第一位数字因为保留到整数,而不是从最后一位开始舍弃;有效数字的概念,如0.500就没有有效数字,0.501就有有效数字)然后这一道题还有非常骚的读入方法#include<bits......
  • 「解题报告」2023-10-17 模拟赛
    Prufer序列(prufer)题目描述:Pigbrain不知道什么时候学习了\(\texttt{prufer}\)序列。\(\texttt{prufer}\)序列可以用来表示一棵树,其构造方法是这样的:对于给定的树,假设节点编号为\(1\dotsn\),那么进行这样的操作:找到编号最小的度数为\(1\)的点。删除该节点,并在序......
  • 「解题报告」2023-10-17 模拟赛
    1、取石子游戏(nim.pas/c/cpp)【题目描述】小林和亮亮正在玩一个取石子的游戏。石子一共有\(n\)堆,其中第\(i\)堆恰好有\(i\)粒石子。小林先取,亮亮后取,并且两人依次轮流取石。每一次取石子的人可以选择任意一堆还未被取完的石子,并取走这一堆中任意多粒石子(注意,不能一粒石......