• HDU 2601An easy problem-素数的运用,暴力求解


    Time Limit: 3000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u

     Status

    Description

    When Teddy was a child , he was always thinking about some simple math problems ,such as “What it’s 1 cup of water plus 1 pile of dough ..” , “100 yuan buy 100 pig” .etc.. 

    One day Teddy met a old man in his dream , in that dream the man whose name was“RuLai” gave Teddy a problem : 

    Given an N , can you calculate how many ways to write N as i * j + i + j (0 < i <= j) ? 

    Teddy found the answer when N was less than 10…but if N get bigger , he found it was too difficult for him to solve. 
    Well , you clever ACMers ,could you help little Teddy to solve this problem and let him have a good dream ? 
     

    Input

    The first line contain a T(T <= 2000) . followed by T lines ,each line contain an integer N (0<=N <= 10 10).
     

    Output

    For each case, output the number of ways in one line.
     

    Sample Input

    2 1 3
     

    Sample Output

    0 1
     对于 N as i * j + i + j (0 < i <= j) ?

     
    能够表示为N=i*j+i+j
    所以能够化作N+1=(i+1)*(j+1);
    如此就有两种思路去做,一暴力枚举,从这里能够看出来i<=sqrt(N+1);
    所以一个循环就能够解决,第一份代码就是。可是耗时才一点就过题目提供的3s了。怎么办,是否还有
    更好的解决方式呢,有的,N+1=(i+1)*(j+1)能够知道N+1是i+1以及j+1的倍数
    如此就能够转换成求解约数的个数(约数是什么,请读者自己百度了解)
    N+1=a1^p1*a2^p2*a3^p3....an^pn
    当中ai是代表着质数,这个的意思是不论什么大于1的数都能够转换为有限个质数因子的乘积
    如此。能够用排列组合来求。第一种有p1+1选择(能够选择0...p1)另外一种有p2+1选择(能够选择0...p2)....第n种有pn+1选择(能够选择0...pn)
    所以约数个数ans=(p1+1)*(p2+1)*(p3+1)*(p4+1)*....*(pn+1)(里面还有减去1和n由于他们不属于题目要求范围)
    当N+1是全然平方数的话,那么除了1以及N+1本身外,唯有最中间的约数是仅仅计算了一次,其它的数都反复的计算了两次,
    当N+1不是全然平方数的话,那么除了1以及N+1本身外,其它的数都反复的计算了两次
    所以能够分开推断输出,也能够直接转换输出就像代码中一样,(ans+1)/2-1,当为全然平方数时,我们须要加一除二才干使正确的结果
    至于减去一,就是前面的去掉1和n这两个不符合条件的数
    当为不全然平方数,ans/2-1就能够了,可是为了合成一个式子,(ans+1)/2-1,是能够取代ans/2-1的
    为什么,由于(4+1)/2==4/2,这是不会影响终于结果的。

    /*
    Author: 2486
    Memory: 1416 KB		Time: 2823 MS
    Language: G++		Result: Accepted
    */
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    typedef long long LL;
    const int maxn=1e5;
    int t;
    LL n;
    int main() {
        scanf("%d",&t);
        while(t--) {
            scanf("%I64d",&n);
            if(n==0||n==1) {
                printf("0
    ");
                continue;
            }
            int cnt=0;
            for(int i=1; i<=sqrt(n); i++) {
                if((n+1)%(i+1)==0&&(n+1)/(i+1)>=i+1)cnt++;
            }
            printf("%d
    ",cnt);
        }
    }

    /*
    Author: 2486
    Memory: 1592 KB		Time: 46 MS
    Language: G++		Result: Accepted
    */
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    typedef long long LL;
    const int maxn=100000+5;
    LL prime[maxn];
    bool vis[maxn];
    int T,cnt;
    LL N;
    void primes() { //初始化素数列表
        cnt=0;
        for(int i=2; i<maxn; i++) {
            if(vis[i])continue;
            prime[cnt++]=i;
            for(int j=i*2; j<maxn; j+=i) {
                vis[j]=true;
            }
        }
    }
    void solve(LL n) {
        LL ans=1;
        for(int i=0; prime[i]*prime[i]<=n; i++) {
            if(n%prime[i]==0) {
                int s=0;
                while(n%prime[i]==0)n/=prime[i],s++;
                ans*=(s+1);
            }
            if(n==1)break;
        }
        if(n>1)ans*=2;
        printf("%I64d
    ",(ans+1)/2-1);
    }
    int main() {
        primes();
        scanf("%d",&T);
        while(T--) {
            scanf("%I64d",&N);
            N++;
            solve(N);
        }
        return 0;
    }
    


  • 相关阅读:
    前沿技术解密——VirtualDOM
    Ques核心思想——CSS Namespace
    Unix Pipes to Javascript Pipes
    Road to the future——伪MVVM库Q.js
    聊聊CSS postproccessors
    【译】十款性能最佳的压缩算法
    Kafka Streams开发入门(9)
    Kafka Streams开发入门(8)
    【译】Kafka Producer Sticky Partitioner
    【译】99th Percentile Latency at Scale with Apache Kafka
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/7120953.html
Copyright © 2020-2023  润新知