• HDU 6069 Counting Divisors(2017 Multi-University Training Contest


      

    Output
    For each test case, print a single line containing an integer, denoting the answer.
     
    Sample Input
    3 1 5 1 1 10 2 1 100 3
     
    Sample Output
    10 48 2302
     
     
    题意:就是那个公式
    感觉还是题解讲的清楚
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cctype> 
     5 #include<cmath>
     6 #include<cstring>
     7 #include<map>
     8 #include<set>
     9 #include<queue>
    10 #include<vector>
    11 #include<algorithm>
    12 #include<string> 
    13 #define ll long long
    14 #define eps 1e-10
    15 #define LL unsigned long long
    16 using namespace std; 
    17 const int maxn=1000000+100;
    18 const int mod=998244353;
    19 int vis[maxn];
    20 int prim[maxn];
    21 ll a[maxn];
    22 ll b[maxn];
    23 int len;
    24 void get_prim() 
    25 {
    26     memset(vis,0,sizeof(vis));
    27     int m=sqrt(maxn+0.5);
    28     for(int i=2;i<=m;i++)
    29     if(vis[i]==0)
    30     for(int j=i*i;j<=maxn;j+=i)
    31     vis[j]=1;
    32     len=0;
    33     for(int i=2;i<=maxn;i++)
    34     if(vis[i]==0)
    35     prim[len++]=i;
    36 }
    37 int main()
    38 {
    39     int t;
    40     ll l,r,k;
    41     get_prim();
    42     scanf("%d",&t);
    43     while(t--)
    44     {
    45         scanf("%lld%lld%lld",&l,&r,&k);
    46         for(int i=0;i<maxn;i++)
    47         {
    48           a[i]=1;
    49           b[i]=i+l;
    50         }
    51           for(int i=0;i<len;i++)
    52           {
    53               ll cnt=l;
    54             if(l%prim[i])cnt=l+prim[i]-l%prim[i];
    55               for(ll j=cnt;j<=r;j+=prim[i])
    56               {
    57                   int count=0;
    58                   while(b[j-l]%prim[i]==0)
    59                   {
    60                       count++;
    61                       b[j-l]/=prim[i];
    62                 }
    63                 a[j-l]=((k*count+1)%mod*a[j-l])%mod;
    64               }
    65           }
    66           ll ans=0;
    67           for(int i=0;i<=r-l;i++)
    68           if(b[i]>1)
    69           a[i]=(a[i]*(k+1))%mod;
    70           for(int i=0;i<=r-l;i++)
    71           {
    72               ans=(ans+a[i])%mod;
    73           }
    74           printf("%lld
    ",ans);
    75     }
    76     return 0;
    77 }
     
  • 相关阅读:
    yocto/bitbake 学习资源
    QEMU/KVM学习资源
    ubuntu 中创建和删除用户
    git 重命名本地和远程分支
    Ubuntu 上搭建 FTP 服务器
    gdb 常见用法
    git log 显示与特定文件相关的 commit 信息
    基于 qemu system mode 运行 arm 程序
    基于 qemu user mode 运行 aarch64 程序
    checking in(airport)
  • 原文地址:https://www.cnblogs.com/Aa1039510121/p/7282572.html
Copyright © 2020-2023  润新知