zoukankan      html  css  js  c++  java
  • loj2000[SDOI2017]数字表格

    题意:f为Fibnacci数列。求$prod_{1<=i<=n,1<=j<=m} f[gcd(i,j)]$.

    n,m<=1e6.

    标程:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 const int mod=1e9+7;
     5 const int N=1e6+1;
     6 int f[N],prime[N],tot,F[N],ans,p[N],n,m,nxt,u[N],fi[N];
     7 int ksm(int x,int y)
     8 {
     9   int res=1;
    10   for (;y;x=(ll)x*x%mod,y>>=1) 
    11     if (y&1) res=(ll)res*x%mod;
    12   return res;
    13 }
    14 void pre()
    15 {
    16   f[1]=f[2]=fi[1]=fi[2]=1;
    17   for (int i=3;i<N;i++) f[i]=((ll)f[i-1]+f[i-2])%mod,fi[i]=ksm(f[i],mod-2);
    18   u[1]=1;
    19   for (int i=2;i<N;i++)
    20   {
    21     if (!p[i]) prime[++tot]=i,u[i]=-1;//质数的u是-1!
    22     for (int j=1;j<=tot&&(ll)prime[j]*i<N;j++)
    23     {
    24       p[prime[j]*i]=1;
    25       if (i%prime[j]==0) break;
    26       u[prime[j]*i]=-u[i];
    27     }
    28   }
    29   for (int i=0;i<N;i++) F[i]=1; 
    30   for (int i=1;i<N;i++)
    31     if (u[i]!=0)
    32     for (int j=i;j<N;j+=i)
    33       F[j]=(ll)F[j]*(u[i]==1?f[j/i]:fi[j/i])%mod;//注意u有可能是-1
    34   for (int i=1;i<N;i++) F[i]=(ll)F[i]*F[i-1]%mod;
    35 }
    36 int main()
    37 {
    38   pre();int T;
    39   scanf("%d",&T);
    40   while (T--) 
    41   {
    42     scanf("%d%d",&n,&m);ans=1;
    43     for (int i=1;i<=min(n,m);i=nxt+1)
    44     {
    45       nxt=min(n/(n/i),m/(m/i));
    46       ans=(ll)ans*ksm((ll)F[nxt]*ksm(F[i-1],mod-2)%mod,(ll)(n/i)*(m/i)%(mod-1))%mod;
    47     } 
    48     printf("%d
    ",ans);
    49   }
    50   return 0;
    51 }
    View Code

    注意点:质数的u是-1!不要忘记。

    题解:mobius反演

    看到gcd就可以提出来,$Ans=prod_{d=1}^{min(n,m)} f[d]^{sum_{i=1}^{lfloorfrac{n}{d} floor}sum_{j=1}^{lfloorfrac{m}{d} floor}[gcd(i,j)=1]}$

    指数上的是mobius经典题,用$mu$函数反演以下,得到$Ans=prod_{d=1}^{min(n,m)} f[d]^{sum_klfloorfrac{n}{dk} floorlfloorfrac{m}{dk} floormu(k)}$。

    令u=kd,$Ans=prod_u(prod_{k|u}f[frac{u}{k}]^{mu(k)})^{lfloorfrac{n}{u} floorlfloorfrac{m}{u} floor}$。分块即可。

    预处理中间那部分东西的前缀积。

  • 相关阅读:
    第一个python的GUI程序
    vbs实现打开记事本,写入一些文字,复制然后关闭
    自己制作的autoitX的vbs脚本,用来自动配置金山毒霸2011局域网更新
    使用免费的unrar.exe解压rar文件
    初学写的几个autoit小程序
    vba调用AutoItX3的Activex控件,实现doc2Html源码
    网页制作相关工具
    vbs自动登陆115网盘代码
    深搜和宽搜的c++实现
    入职一个月有感
  • 原文地址:https://www.cnblogs.com/Scx117/p/9171559.html
Copyright © 2011-2022 走看看