zoukankan      html  css  js  c++  java
  • LightOJ 1028

    **题意:**10000组数据 问一个数n[1,1e12] 在k进制下有末尾0的k的个数。 **思路:**题意很明显,就是求n的因子个数,本来想直接预处理欧拉函数,然后拿它减n就行了。但注意是1e12次方法不可行。而一般的求因子显然也太慢,所有要想另一个办法。已知任意数可以分解成几个**质因数幂的乘积**,所以求出n所有的**质因数**和它的**指数**再进行**排列组合**就可以得到答案了。
    #include <stdio.h>
    #include <iostream>
    #include <string.h>
    #include <algorithm>
    #include <utility>
    #include <vector>
    #include <map>
    #include <set>
    #include <string>
    #include <stack>
    #include <queue>
    #define LL long long
    #define MMF(x) memset((x),0,sizeof(x))
    #define MMI(x) memset((x), INF, sizeof(x))
    using namespace std;

    const int INF = 0x3f3f3f3f;
    const int N = 1e6+2000;
    LL pri[N];
    LL vis[N];
    LL c = 0;
    void prime()
    {
    MMF(vis);
    for(LL i = 2; i < N; i++)
    {
    if(!vis[i])
    {
    for(LL j = i*i; j < N; j+= i)
    vis[j] = 1;
    pri[c++] = i;
    }
    }
    }

    int main()
    {
    prime();
    int T;
    int cnt = 0;
    cin >> T;
    while(T--)
    {
    LL n;
    scanf("%lld", &n);
    LL ans = 1;
    for(int i = 0; i < c && pri[i]*pri[i] <= n; i++)
    {
    int ct = 0;
    while(n % pri[i] == 0)
    {
    ct++;
    n /= pri[i];
    }
    ans *= ct+1;
    }
    if(n > 1)//减枝后考虑n为质数的情况
    ans <<= 1;
    printf("Case %d: %lld ", ++cnt, ans - 1);
    }
    return 0;
    }
    //可知任意数可分解成(p1^x)(p2^y)…的形式,所以求解因子只要在x、y、z…间排列组合就可以了
    //这题无法直接使用欧拉函数打表,1e12的数据量定会超时
  • 相关阅读:
    intellij常用快捷键
    C++ 虚函数详解
    第七周作业
    第六周作业
    第四周作业
    第三周作业
    第二周作业
    第一周作业附加作业
    第一周作业。
    第0次作业
  • 原文地址:https://www.cnblogs.com/Yumesenya/p/6008097.html
Copyright © 2011-2022 走看看