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;

}

原文地址:https://www.cnblogs.com/GODLIKEING/p/3336730.html