zoukankan      html  css  js  c++  java
  • 【BZOJ】【2154】Crash的数字表格

    莫比乌斯反演

      PoPoQQQ讲义第4题

      题解:http://www.cnblogs.com/jianglangcaijin/archive/2013/11/27/3446169.html

      感觉两次sqrt(n)的枚举是亮点……

    RE:汗- -b 10^7是8位数,开数组少打了一个0……

     1 /**************************************************************
     2     Problem: 2154
     3     User: Tunix
     4     Language: C++
     5     Result: Accepted
     6     Time:8780 ms
     7     Memory:167292 kb
     8 ****************************************************************/
     9  
    10 //BZOJ 2154
    11 #include<cstdio>
    12 #include<cstdlib>
    13 #include<cstring>
    14 #include<iostream>
    15 #include<algorithm>
    16 #define rep(i,n) for(int i=0;i<n;++i)
    17 #define F(i,j,n) for(int i=j;i<=n;++i)
    18 #define D(i,j,n) for(int i=j;i>=n;--i)
    19 using namespace std;
    20  
    21 int getint(){
    22     int v=0,sign=1; char ch=getchar();
    23     while(ch<'0'||ch>'9') {if (ch=='-') sign=-1; ch=getchar();}
    24     while(ch>='0'&&ch<='9') {v=v*10+ch-'0'; ch=getchar();}
    25     return v*=sign;
    26 }
    27 /*******************tamplate********************/
    28 const int N=10000086,P=20101009;
    29 typedef long long LL;
    30 LL prime[N],mu[N];
    31 bool check[N];
    32 LL n,m;
    33 void getmu(int n){
    34     int tot=0;
    35     mu[1]=1;
    36     for(int i=2;i<n;i++){
    37         if (!check[i]){
    38             prime[tot++]=i;
    39             mu[i]=-1;
    40         }
    41         rep(j,tot){
    42             if (i*prime[j]>n) break;
    43             check[i*prime[j]]=1;
    44             if (i%prime[j]) mu[i*prime[j]]=-mu[i];
    45             else{
    46                 mu[i*prime[j]]=0;
    47                 break;
    48             }
    49         }
    50     }
    51     F(i,1,n) mu[i]=(mu[i-1]+mu[i]*i%P*i%P)%P;
    52 }
    53 inline LL Sum(LL n,LL m){
    54     n=n*(n+1)/2%P;
    55     m=m*(m+1)/2%P;
    56     return n*m%P;
    57 }
    58 inline LL f(LL n,LL m){
    59     LL ans=0,i,last;
    60     for(i=1;i<=n;i=last+1){
    61         last=min(n/(n/i),m/(m/i));
    62         ans=(ans+(mu[last]-mu[i-1])%P*Sum(n/i,m/i)%P)%P;
    63     }
    64     return ans;
    65 }
    66 int main(){
    67 //  freopen("input.txt","r",stdin);
    68     n=getint(); m=getint();
    69     if(n>m) swap(n,m);
    70     getmu(m);
    71     LL ans=0,i,last;
    72     for(i=1;i<=n;i=last+1){
    73         last=min(n/(n/i),m/(m/i));
    74         ans=(ans+(i+last)*(last-i+1)/2%P*f(n/i,m/i)%P)%P;
    75     }
    76     if (ans<0) ans+=P;
    77     printf("%lld
    ",ans);
    78     return 0;
    79 }
    View Code

    2154: Crash的数字表格

    Time Limit: 20 Sec  Memory Limit: 259 MB
    Submit: 1327  Solved: 529
    [Submit][Status][Discuss]

    Description

    今 天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple)。对于两个正整数a和b,LCM(a, b)表示能同时被a和b整除的最小正整数。例如,LCM(6, 8) = 24。回到家后,Crash还在想着课上学的东西,为了研究最小公倍数,他画了一张N*M的表格。每个格子里写了一个数字,其中第i行第j列的那个格子里 写着数为LCM(i, j)。一个4*5的表格如下: 1 2 3 4 5 2 2 6 4 10 3 6 3 12 15 4 4 12 4 20 看着这个表格,Crash想到了很多可以思考的问题。不过他最想解决的问题却是一个十分简单的问题:这个表格中所有数的和是多少。当N和M很大 时,Crash就束手无策了,因此他找到了聪明的你用程序帮他解决这个问题。由于最终结果可能会很大,Crash只想知道表格里所有数的和mod 20101009的值。

    Input

    输入的第一行包含两个正整数,分别表示N和M。

    Output

    输出一个正整数,表示表格中所有数的和mod 20101009的值。

    Sample Input

    4 5

    Sample Output

    122
    【数据规模和约定】
    100%的数据满足N, M ≤ 107。

    HINT

    Source

    [Submit][Status][Discuss]
  • 相关阅读:
    [禅悟人生]生活中的烦恼, 一笑了之
    [禅悟人生]开放你的胸怀, 释放自己的灵魂
    [唐诗]诗(选二首)-王梵志
    [唐诗]吾富有钱时-王梵志
    [数分提高]2014-2015-2第6教学周第2次课讲义 3.4 导数的综合应用
    [数分提高]2014-2015-2第6教学周第1次课
    [数分提高]2014-2015-2第5教学周第2次课
    [数分提高]2014-2015-2第5教学周第1次课
    [数分提高]2014-2015-2第4教学周第2次课
    [数分提高]2014-2015-2第6教学周第1次课讲义 3.3 Taylor 公式
  • 原文地址:https://www.cnblogs.com/Tunix/p/4297366.html
Copyright © 2011-2022 走看看