本原串(map加快速幂)
2015-07-04 16:16
148 查看
有一个问题就是不知道为什么要加入 sum=(sum+2008)%2008;
#include <cstdio> #include<iostream> #include<cmath> #include<map> #define ll long long using namespace std; /* 这一题其实不难,就是让你找字串 我们知道全有0和1组成的长度为0的字符串有2^n种! 所以在这里要减去他的字串,首先他的字串的长度必须是能被他整除 所以这里就相当于找约数了! 这里加入了递推!也加入了map,这里map用于记录已经找到的数的非字串的 所有个数,所以如果这个数是要求的n的约数就可以直接求了! */ map<ll,ll>mp; ll pow_mod(ll a,ll n,ll m) { ll ans = 1; a = a % m; while(n>0) { if(n%2 ==1) ans=(ans*a)%m; n=n/2; a=(a*a) % m; } return ans; } ll cal(ll n) { ll i,sum; sum=pow_mod(2,n,2008)-2;//去掉本身的00000和111111 if(mp !=0) { return mp ; } //通过上面判断mp 是否为0,来快速计算1 else { if(n==1) { return 2; } for(i=2;i*i<=n;i++) { if(n%i==0) { sum-=cal(i); if(n!=i*i) { sum-=cal(n/i); } } } } sum%=2008; sum=(sum+2008)%2008;//这里不知道为什么要加入这个东西,不加就会wrong answer! mp =sum; return sum; } int main() { ll n; mp[1]=mp[2]=2; while(cin>>n) { cout<<cal(n)<<endl; } }
相关文章推荐
- 从网络下载图片,并存入本地缓存
- lintcode:Scramble String
- 日期的国际化 和DateFormat / SimpleDateFormat 相互转换
- Uber 司机有话说:你以为当个 Uber 司机很轻松?大错特错!
- IPv4编址及子网划分
- 开辟经济发展的第二战场
- 创建git 仓库
- 双向一对多的删除
- PPT中画折线
- 编译安装git
- 随机过程
- 表格中我不知道那些事!
- 滴滴司机:要不是Uber,我买奥迪的45万元不知何时赚回来呢!
- JAVA并发2
- 【Oracel 基础】小结
- 沙盒目录结构
- 西方国家市场经济的不同模式
- 苹果开发者账号
- 实现经济体制的根本转变
- C语言实现md5函数代码