您的位置:首页 > 其它

BZOJ4816: [Sdoi2017]数字表格

2017-12-10 16:52 246 查看
Description

Doris刚刚学习了fibonacci数列。用f[i]表示数列的第i项,那么

f[0]=0

f[1]=1

f
=f[n-1]+f[n-2],n>=2

Doris用老师的超级计算机生成了一个n×m的表格,第i行第j列的格子中的数是f[gcd(i,j)],其中gcd(i,j)表示i,

j的最大公约数。Doris的表格中共有n×m个数,她想知道这些数的乘积是多少。答案对10^9+7取模。

Input

有多组测试数据。

第一个一个数T,表示数据组数。

接下来T行,每行两个数n,m

T<=1000,1<=n,m<=10^6

Output

输出T行,第i行的数是第i组数据的结果

Sample Input

3

2 3

4 5

6 7

Sample Output

1

6

960

题目传送门

为了做这道题,我去学了读入优化

为了这道题,我复习了怎么样对拍

为了这道题,我托同学找了dsy的数据

SB出题人%%#%¥#@

我现在头脑有点昏

因为首先我没有接触过这种东西啊,这是莫比乌斯反演吗?

我熟悉的两种公式套上面TLE到死为止

然后看别人博客:


这个是什么啊??完全没接触过!!

%%%%%%大佬

错了数据都没用!

可怜我整整一版的TLE

代码如下:

#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
inline int read()
{
int x=0;
char ch=getchar();
while(ch>'9'||ch<'0'<
4000
/span>)ch=getchar();
while(ch>='0'&&ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
return x;
}
typedef long long ll;
const int N=1000000+10,mod=1000000007;
ll f
,fv
;
int n, m;
ll pow_mod(ll a, ll b)
{
ll ans=1;
while(b)
{
if(b&1) ans=(ans*a)%mod;
a=(a*a)%mod;b/=2;
}
return ans;
}
int main()
{
f[1]=1;
for(int i=2;i<N;i++)
f[i]=(f[i-1]+f[i-2])%mod;
for(int i=1;i<N;i++)
{
ll inv=pow_mod(f[i],mod-2);
for(int j=i+i;j<N;j+=i)
f[j]=(f[j]*inv)%mod;
}
f[0]=1;
for(int i=1;i<N;i++) f[i]=(f[i]*f[i-1])%mod;
for(int i=0;i<N;i++) fv[i]=pow_mod(f[i],mod-2);
int t=read();
ll ans;
while(t--)
{
int n=read(),m=read();
if(n>m) swap(n,m);
ans=1;
for(int i=1,p;i<=n;i=p+1)
{
p=min(n/(n/i),m/(m/i));
ans=ans*pow_mod(pow_mod((f[p]*fv[i-1] % mod),(ll)n/i),(ll)m/i)%mod;
}
printf("%lld\n",ans);
}
return 0;
}


by_lmy
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: