• 【Troywar love Maths】——莫比乌斯反演


              2816. Troywar loves Maths

                    ★★☆   输入文件:Troy_1.in   输出文件:Troy_1.out   简单对比
                            时间限制:1 s   内存限制:256 MB

    【题目描述】

    众所周知,Troywar总是不好好上课看数(xiao)论(shuo)。一天数学老师是在看不下去了,于是决定考(jiao)考(xun)他一下。于是,扔给了Troywar一个问题:给定两个正整数n和m,有多少对1<=i<=n,1<=j<=m使得$a=2^{i}+1,b=2^{j}+1$满足a和b的最大公约数为3。翘课的Troywar当然不会了,他只好求助你。

    【输入格式】

    两个正整数n,m

    【输出格式】

    一个整数。

    【样例输入】

    10 10

    【样例输出】

    19

    【数据范围】

    1.10% n,m<=63

    2.另有20%数据保证n,m<=1000

    3.另有20%数据保证n<=3

    4.对于所有数据,保证n,m<=1e7

    【来源】

    Troywar

    题解:

       第一次出题,也不知道有没有人做……我们先把n调成n,m中小的,m为较大的。

    $sum_{i=1}^{n}sum_{j=1}^{m}[gcd(2^{i}+1,2^{j}+1)==3]$


    $首先,我们的要求是3|2^{x}+1$
    $2^x+1equiv 2^{x\,mod phi(3)}+1(mod)3$
    $所以当x为奇数时才可能成立,先令i>j$

    $;;;;gcd(2^{i}+1,2^{j}+1)=gcd(2^{i}-2^{j},2^j+1)$
    $=gcd(2^{i-j}-1,2^j+1)$
    $=gcd (2^{i-j}+2^j,2^j+1)$

    $若i-j>j$
    $gcd(2^{i}+1,2^{j}+1)=gcd(2^{i-2j}+1,2^j+1)$
    $否则$
    $gcd(2^{i}+1,2^{j}+1)=gcd(2^{2j-i}+1,2^j+1)$
    $联系辗转相除$
    $gcd(2^{i}+1,2^{j}+1)=2^{gcd(i,j)}+1$
    $所以有gcd(i,j)==1且i、j为奇数$

    $ herefore Ans=sum_{i=1}^{n}sum_{j=1}^{m}[gcd(i,j)==1&i、j为奇数] $

    $=sum_{i=1}^{n}sum_{j=1}^{m}[gcd(i,j)==1]-sum_{i=1}^{lfloor frac n 2 floor}sum_{j=1}^{m}[gcd(i,j)==1]-sum_{i=1}^{lfloor frac m 2 floor}sum_{j=1}^{n}[gcd(i,j)==1]$

    $=sum_{d=1}^{n}mu(d)lfloor frac m d floorlfloor frac n d floor-sum_{d=1}^{n}mu(d)lfloor frac m d floorlfloor frac n {kd} floor-sum_{d=1}^{n}mu(d)lfloor frac m {kd} floorlfloor frac n d floor$

    $其中当d为奇数时,k为2,否则k为1$

      对于前10%是为了给暴力分……至于n<=3是为了打表找规律,再结合前10%验证。n,m小于1000……当作给不会反演的分吧……

    标程:

      

     1 #define Troy 09/29/2017
     2 
     3 #include<bits/stdc++.h>
     4 
     5 using namespace std;
     6 
     7 typedef long long ll;
     8 
     9 
    10 const int N=1e7+1;
    11 
    12 int miu[N],prim[N/5],num,sum[N];
    13 bool vis[N];
    14 
    15 inline void init(){
    16     miu[1]=1;
    17     sum[1]=1;
    18     for(int i=2;i<N;i++){
    19         if(!vis[i])
    20             prim[++num]=i,miu[i]=-1;
    21         for(int j=1;prim[j]*i<N;j++){
    22             vis[i*prim[j]]=1;
    23             if(i%prim[j]==0){
    24                 miu[i*prim[j]]=0;
    25                 break;
    26             }
    27             miu[i*prim[j]]=-miu[i];
    28         }
    29         sum[i]=sum[i-1]+miu[i];
    30     }
    31 }
    32 
    33 int n,m;
    34 
    35 int main(){ init();
    36     freopen("Troy_1.in", "r", stdin);
    37     freopen("Troy_1.out","w",stdout);
    38     scanf("%d%d",&n,&m);
    39     if(n>m) n^=m^=n^=m;
    40     ll ans=0;
    41     for(int i=1;i<=n;i++){
    42         ll t=1ll*miu[i]*(n/i)*(m/i),d;
    43         if(i&1){
    44             d=1ll*miu[i]*(1ll*(n/i)*(m/i/2)+1ll*(n/i/2)*(m/i));
    45         }
    46         else    
    47             d=1ll*2*miu[i]*(n/i)*(m/i);
    48         ans+=t-d;
    49     }
    50     printf("%lld
    ",ans);
    51 }
  • 相关阅读:
    自我介绍
    币值转换
    打印沙漏
    对我影响最大的三位老师

    pta
    pta-3
    学习计划
    对我有影响的三个老师
    介绍自己
  • 原文地址:https://www.cnblogs.com/Troywar/p/7611969.html
Copyright © 2020-2023  润新知