zoukankan      html  css  js  c++  java
  • xdu2017校赛F

    Problem F Dogs of Qwordance Senior Backend R&D Engineers
    问题描述
    那年夏天,锘爷和杰师傅漫步在知春公园的小道上。他们的妻子、孩子牵 着狗在前面嬉戏,二人笑语盈盈,他们不深究一个小的编程问题,而是对整个 Qwordance (四字舞蹈)公司的发展前景加以描绘。这样的场景,想想就觉得好 美,想想就好向往,想想就好激动。然而,他们的狗觉得这非常的无聊,决定自 己去玩。 杰师傅的狗非常挑剔。它希望找到一块面积为 x 的长方形广场,还要求广 场的长和宽都是整数。锘爷的狗不屑地说:“这还不简单,总共有 σ0(x) 种方案 呢。”杰师傅的狗却摇了摇头说:“找到这个广场后,我们要在上面画上水平和垂 直的网格,使得水平、垂直网格之间的间距分别是相同的整数。算了这太难了, 我们去听他们讨论 Qwordance 未来发展大方向吧。”锘爷的狗说:“这也不难啊, 总共有,咦,多少方案啊?”杰师傅的狗鄙视道:“你看你连个方案数都算不出, 我不要和你玩了。像你这样的狗在朝鲜是会被做成狗肉火锅的。你走吧。”锘爷 的狗想去问锘爷的儿子(中关村小学生信息学竞赛冠军),然而怕被小主人嘲笑, 请你帮帮它吧。
    输入格式 输入包含多组数据(最多 450 组),请处理到文件结束。
    每组数据包含一个整数,即 x 。 对于所有数据有 1 ≤ x ≤ 1012。
    输出格式 对于每组数据输出 1 行,包含面积为 x 的广场的方案数。
    只要广场的长或 宽不同,或网格划分方案不同,就是不同的方案(见样例解释)。
    输入输出样例 输入样例 输出样例
    1 4
    1 10

     关键:令$zeta (x)$=一个数的质因子的个数,$f(x)$为解的个数,

       因为任何一个数可以按照唯一分解定理,分解为$x = prodlimits_{i = 1}^k {{p_i}^{{a_i}}} $,${p_i}$为质数,

        因此,$zeta (x) = prodlimits_{i = 1}^k {({a_i} + 1)}$,

        $f(x) = sumlimits_{d|n} {prodlimits_{i = 1}^k {({a_i} + 1)*({c_i} - {a_i} + 1)} } $

        $f(x) = prodlimits_{i = 1}^k {sumlimits_{j = 1}^{{a_i}} {(j + 1)({a_i} - j + 1)} } $(乘法原理)

    注意:(1)分解质因数时,只需到$sqrt n $即可,因为大于等于$sqrt n $的质数最多只有一个,这时候,只需将结果乘4即可。

       (2)分解素数的两种方法,埃氏筛法、线性筛法,其中线性筛法的复杂度更低,埃氏筛法可以舍弃了。

       (3)时常注意优化复杂度(dalao的教导)

       (4)ios::sync_with_stdio(false);可用于加快cin与cout的速度。

    线性筛:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 #define N 10000001
     5 ll prime[N+2],k;
     6 bool is_not_prime[N+2]={true,true};
     7 void sieve(){
     8     for(ll i=2;i<N;i++){
     9         if(!is_not_prime[i]){
    10             prime[k++]=i;
    11         }
    12         for(ll j=0;j<k&&i*prime[j]<N;j++){
    13             is_not_prime[i*prime[j]]=true;
    14             if(i%prime[j]==0) break;
    15         }
    16     }
    17 }
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 #define N 1000002
     5 int prime[N+3],p;
     6 ll n;
     7 bool is_prime[N+3];
     8 int index[N+3];
     9 void sieve(){
    10     p=0;
    11     for(int i=0;i<N;i++){
    12         is_prime[i]=true;
    13     }
    14     is_prime[0]=is_prime[1]=false;
    15     for(int i=2;i<N;i++){
    16         if(is_prime[i]){
    17             prime[p++]=i;
    18             for(int j=2*i;j<N;j+=i){
    19                 is_prime[i]=false;
    20             }
    21         }
    22     }
    23 }//埃筛 
    24 /*void sieve(){
    25     is_prime[1]=1;
    26     for(ll i=2;i<N;++i){
    27         if(!is_prime[i])prime[p++]=i;
    28         for(ll j=0;j<p&&prime[j]*i<N;++j){
    29             is_prime[prime[j]*i]=1;
    30             if(i%prime[j]==0)break;
    31         }
    32     }
    33 }*/
    34 //线性筛 
    35 
    36 int main(){
    37     ios::sync_with_stdio(false);
    38     sieve();
    39     while(cin>>n){
    40         ll ans=1;
    41         for(int i=0;1ll*prime[i]*prime[i]<=n;i++){
    42             if(n%prime[i]==0){
    43                 ll index=0,part=0;
    44                 while(n%prime[i]==0){
    45                     n/=prime[i];
    46                     index++;
    47                 }
    48                 for(ll j=0;j<=index;j++) part+=(j+1)*(index-j+1);
    49                 ans*=part;
    50             }
    51         }if(n!=1) ans*=4;
    52         cout<<ans<<endl;
    53     }
    54     return 0;
    55 }
  • 相关阅读:
    【校内模拟7.30】—slay(容斥+dp)
    【校内模拟7.30】—slay(容斥+dp)
    【校内模拟7.30】—Ball(bitset)
    【校内模拟7.30】—Ball(bitset)
    多测师讲解rf _基本使用002_高级讲师肖sir
    多测师讲解 自动化测试理论(1)_高级讲师肖sir
    多测师讲解selenium_运行报告相出错归纳_高级讲师肖sir
    多测师讲解selenium—自动化测试课堂面试题总结—高级讲师肖sir
    多测师讲解python _unttest框架002(结合项目实战)_高级讲师肖sir
    多测师讲解python _unttest框架001(基本格式)_高级讲师肖sir
  • 原文地址:https://www.cnblogs.com/elpsycongroo/p/6756323.html
Copyright © 2011-2022 走看看