zoukankan      html  css  js  c++  java
  • HDU 2197 本原串

    本原串

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 517    Accepted Submission(s): 176

    Problem Description
    由0和1组成的串中,不能表示为由几个相同的较小的串连接成的串,称为本原串,有多少个长为n(n<=100000000)的本原串? 答案mod2008. 例如,100100不是本原串,因为他是由两个100组成,而1101是本原串。
     
    Input
    输入包括多个数据,每个数据一行,包括一个整数n,代表串的长度。
     
    Output
    对于每个测试数据,输出一行,代表有多少个符合要求本原串,答案mod2008.
     
    Sample Input
    1
    2
    3
    4
     
    Sample Output
    2
    2
    6
    12
     
    Author
    scnu
     
    Recommend
    lcy
     
    思路:思路找到只是成功的一半啊,这个题思路很容易想到,但是要AC还是
    不简单,开始我使用快速幂 + 递归求解,可惜被无情的超时了,最后用空间
    换时间才过了
     
    代码:

    #include <iostream>

    #include <cstring>

    #include <cstdio>

    #include <cstdlib>

    #include <algorithm>

    using namespace std;

    int n;

    const int mod = 2008;

    int hash[1001000];

    int pow(int a,int b)

    {   

    int sum = 1;   

    while(b > 1)   

    {       

    if(b % 2 == 1)       

    {           

    sum *= a;b --;           

    sum %= mod;       

    }       

    a = (a * a) % mod;b /= 2;

       }   

    sum = (sum * a) % mod;   

    return sum;

    } int get(int n)

    {    

    int sum = 0;    

    if(n == 1)        

    return 2;    

    for(int i = 2;i * i <= n;++ i)    

    {        

    if(n % i == 0)        

    {            

    if(i >= 1000000)               

    sum = (sum + get(i)) % mod;            

    else            

    {               

    if(hash[i] == 0)                   

    sum = (sum + get(i)) % mod;               

    else                   

    sum = (sum + hash[i]) % mod;            

    }         if(n / i != i)        

    {            

    if(n / i >= 1000000)                  

    sum = (sum + get(n/ i)) % mod;            

    else            

    {               

    if(hash[n / i] == 0)   

      sum = (sum + get(n / i)) % mod;               

    else                    

    sum = (sum + hash[n / i]) % mod;            

    }        

    }        

    }    

    }    

    if(n < 1000000)        

     hash[n] = (pow(2,n) - sum - 2 + mod) % mod;    

    return (pow(2,n) - sum - 2 + mod) % mod;

    }

    int main()

    {   

     memset(hash,0,sizeof(hash));    

    while(~scanf("%d",&n))    

    {        

    printf("%d ",get(n));    

    }    

    return 0;

    }

  • 相关阅读:
    19.模块化
    20.ES7新特性
    22.ES9
    21.ES8新特性
    RabbitMQ:排他性队列(Exclusive Queue)
    为什么要使用消息队列
    收集RabbitMQ的用户
    身份管理提供商:Gigya和PingIdentity
    HTTP协议原理(详细)
    转:Linux下高并发socket最大连接数所受的各种限制
  • 原文地址:https://www.cnblogs.com/GODLIKEING/p/3336730.html
Copyright © 2011-2022 走看看