2017.6.15 数字表格 思考记录
2017-06-15 07:37
387 查看
利用gcd相同数相乘,可以比较基础的化到
然后就是设T=ij,利用除法了
但这个西格玛在指数上,怎么办呢?
其实是不影响的,只要保证约数、倍数关系对好就行了
易错点:
1、大量取模逆元快速幂
2、m/i *n/i 要取模P-1、
3、赋初值为1
码:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#include<cstring>
#define P 1000000007
#define N 1000005
#define ll long long
int su
,tot,mu
,T;
ll sum
,ny
,x,y,n,m,i,j,fny
,f
;
bool he
;
ll ksm(ll a,ll b)
{
ll daan=1;
while(b)
{
if(b%2==1)daan=(daan*a)%P;
b/=2;
a=(a*a)%P;
}
return daan;
}
void exgcd(ll a,ll b)
{
if(!b)
{
x=1;
y=0;
return;
}
exgcd(b,a%b);
ll t=y;
y=x-(a/b)*y;
x=t;
}
void eular()
{
ll i,j;
mu[1]=1;sum[1]=1;sum[0]=1;
for(i=2;i<=N-5;i++)
{sum[i]=1;
if(!he[i])
{
su[++tot]=i;
mu[i]=-1;
}
for(j=1;j<=tot&&su[j]*i<=N-5;j++)
{
he[i*su[j]]=1;
if(i%su[j]==0)
{
mu[su[j]*i]=0;
break;
} else mu[su[j]*i]=-mu[i];
}
}
//
for(i=1;i<=N-5;i++)
{
for(j=1;j*i<=N-5;j++)
{
if(mu[j]==1)
{
// cout<<sum[i*j]<<" ";
sum[i*j]=sum[i*j]*f[i]%P;
//cout<<sum[i]<<endl;
}
if(mu[j]==-1)
{
sum[i*j]=sum[i*j]*fny[i]%P;
}
}
}
//cout<<i<<" ";
//sum[0]=1;
for(i=1;i<=N-5;i++)
{
sum[i]=(sum[i]*sum[i-1])%P;
exgcd(sum[i],P);
ny[i]=x;
}//
//cout<<"p";
//for(i=1;i<=1000;i++)cout<<sum[i]<<" ";
}
ll work()
{
ll ans=1,lin=0,i;
for(i=1;i<=n;i=lin+1)
{
lin=min(n/(n/i),m/(m/i));
ans=ans*ksm(sum[lin]*ny[i-1]%P,(n/i)*(m/i)%(P-1))%P;
}
return ((ans+P)%P);
}
int main()
{
ny[0]=1;
fny[0]=1;
f[0]=0;
f[1]=1;fny[1]=1;
for(i=2;i<=N-5;i++)
{
f[i]=(f[i-1]+f[i-2])%P;
exgcd(f[i],P);
fny[i]=x;
}
// for(i=1;i<=100;i++)cout<<fny[i]<<" ";
eular();
scanf("%d",&T);
while(T--)
{
scanf("%lld%lld",&n,&m);
if(n>m)swap(n,m);
printf("%lld\n",work());
}
}
然后就是设T=ij,利用除法了
但这个西格玛在指数上,怎么办呢?
其实是不影响的,只要保证约数、倍数关系对好就行了
易错点:
1、大量取模逆元快速幂
2、m/i *n/i 要取模P-1、
3、赋初值为1
码:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#include<cstring>
#define P 1000000007
#define N 1000005
#define ll long long
int su
,tot,mu
,T;
ll sum
,ny
,x,y,n,m,i,j,fny
,f
;
bool he
;
ll ksm(ll a,ll b)
{
ll daan=1;
while(b)
{
if(b%2==1)daan=(daan*a)%P;
b/=2;
a=(a*a)%P;
}
return daan;
}
void exgcd(ll a,ll b)
{
if(!b)
{
x=1;
y=0;
return;
}
exgcd(b,a%b);
ll t=y;
y=x-(a/b)*y;
x=t;
}
void eular()
{
ll i,j;
mu[1]=1;sum[1]=1;sum[0]=1;
for(i=2;i<=N-5;i++)
{sum[i]=1;
if(!he[i])
{
su[++tot]=i;
mu[i]=-1;
}
for(j=1;j<=tot&&su[j]*i<=N-5;j++)
{
he[i*su[j]]=1;
if(i%su[j]==0)
{
mu[su[j]*i]=0;
break;
} else mu[su[j]*i]=-mu[i];
}
}
//
for(i=1;i<=N-5;i++)
{
for(j=1;j*i<=N-5;j++)
{
if(mu[j]==1)
{
// cout<<sum[i*j]<<" ";
sum[i*j]=sum[i*j]*f[i]%P;
//cout<<sum[i]<<endl;
}
if(mu[j]==-1)
{
sum[i*j]=sum[i*j]*fny[i]%P;
}
}
}
//cout<<i<<" ";
//sum[0]=1;
for(i=1;i<=N-5;i++)
{
sum[i]=(sum[i]*sum[i-1])%P;
exgcd(sum[i],P);
ny[i]=x;
}//
//cout<<"p";
//for(i=1;i<=1000;i++)cout<<sum[i]<<" ";
}
ll work()
{
ll ans=1,lin=0,i;
for(i=1;i<=n;i=lin+1)
{
lin=min(n/(n/i),m/(m/i));
ans=ans*ksm(sum[lin]*ny[i-1]%P,(n/i)*(m/i)%(P-1))%P;
}
return ((ans+P)%P);
}
int main()
{
ny[0]=1;
fny[0]=1;
f[0]=0;
f[1]=1;fny[1]=1;
for(i=2;i<=N-5;i++)
{
f[i]=(f[i-1]+f[i-2])%P;
exgcd(f[i],P);
fny[i]=x;
}
// for(i=1;i<=100;i++)cout<<fny[i]<<" ";
eular();
scanf("%d",&T);
while(T--)
{
scanf("%lld%lld",&n,&m);
if(n>m)swap(n,m);
printf("%lld\n",work());
}
}
相关文章推荐
- 2017.6.12 crash的数字表格 思考记录
- 2017.5.5 小朋友的数字 思考记录
- 2017.3.14 不重复数字 思考记录
- 获得N^2个往返接力数字表格的算法
- 【BZOJ 4816】 4816: [Sdoi2017]数字表格 (莫比乌斯)
- 2017.9.7 骑士 思考记录
- BZOJ2154 Crash的数字表格
- LeetCode Excel Sheet Column Title(表格列数数字到英文转换)
- BZOJ 2154 Crash的数字表格
- 用于查询当前数据库中所有表格的记录条数的脚本
- Bzoj2154 Crash的数字表格
- 用表格输出1-1000之间的数字实现代码(附特效)
- 又学一招,记录之,数字日期互转
- Bzoj 2154: Crash的数字表格(积性函数)
- 在ALV表格中双击某一行记录后,显示明细记录
- BZOJ2154 Crash的数字表格
- 用于查询当前数据库中所有表格的记录条数的脚本
- 2017.9.17 相关分析 思考记录
- Python转非表格格式txt(汉字or数字)为xls
- 2017.5.11 道路修建 思考记录