零、写在前面
一、主要知识点
因数的个数判别
其中国ei为n的包含的每个质因子的个数。
对于有
二、课后习题详解
The number of divisors
思路
题目说的意思是给你一个树只包含2、3、5、7因子,你需要返回它包含的所有因子数量。
思路,求出它包含的每个质因子数量做乘积就好了
#include<cstdio>
int main(){
long long n;
int yueshu[] = {2,3,5,7}; //所有的约数
while(scanf("%lld",&n) != EOF && n != 0){ //输入的判定
long long ans = 1; //结果
for(int i = 0;i < 4;++i){
int count = 0;
for(;n % yueshu[i] == 0;n /= yueshu[i]) count ++; //判断约数的个数
ans *= count + 1; //公式
}
printf("%lld\n",ans);
}
return 0;
}
结果分析
还行吧。。。
本原串
本原串http://acm.hdu.edu.cn/showproblem.php?pid=2197http://acm.hdu.edu.cn/showproblem.php?pid=2197 由0和1组成的串中,不能表示为由几个相同的较小的串连接成的串,称为本原串,有多少个长为n(n<=100000000)的本原串?
答案mod2008.
例如,100100不是本原串,因为他是由两个100组成,而1101是本原串。
思路
其实大的n的本源串和小的本源串是有关系的,我们来观察一下。
F(1) = 2;
F(2) = 2^2 - F(1) = 2;
F(3) = 2^3 - F(1) = 6;
F(4) = 2^4 - F(2) - F(1) = 12;
其实很容易理解,如果一个数字含有这个因子,那么就将那个因子对应的本源串减去。因为有这个因子就可以由这个因子产生的本源串产生。比如 00 01 10 11中 00 和11 就是1对应的0 和1 产生的。
有了这样的思路,程序并不难写出,值得注意的是可以将计算过的结果进行记录,方便下次使用。
#include<cstdio>
int F[100000005] = {0};
int pow_mod(long long a,long long n,int Mod){//快速二分幂的非递归实现
long long ans=1;
while(n){
if(n & 1)
ans = ans * a % Mod;
a = a * a % Mod;
n>>=1;
}
return ans % Mod;
}
int get_num(int n){
if(F[n]) return F[n];
int num = pow_mod(2,n,2008) - F[1];
int i;
for(i = 2;i*i <n;++i){
if(n % i == 0){
num = (num - get_num(i))%2008;
num = (num - get_num(n/i))%2008;
}
}
if(i*i == n) num = (num - get_num(i))%2008;
F[n] = (num +2008)%2008;
return F[n];
}
int main(){
F[1] = 2;
int n;
while(scanf("%d",&n) != EOF){
if(n < 2) printf("%d\n",F[n]);
else{
if(!F[n]) F[n] = get_num(n);
printf("%d\n",F[n]);
}
}
return 0;
}
结果分析
感觉还能优化,但是肝不动了。。。
课后总结
今天要好好做作业。。。时间都去哪了。。。不够用啊-.-