本原串(map加快速幂)
来源:互联网 发布:淘宝的选购热点 编辑:程序博客网 时间:2024/04/30 02:56
有一个问题就是不知道为什么要加入 sum=(sum+2008)%2008;
#include <cstdio>#include<iostream>#include<cmath>#include<map>#define ll long longusing 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[n]!=0) { return mp[n]; } //通过上面判断mp[n]是否为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[n]=sum; return sum;}int main(){ ll n; mp[1]=mp[2]=2; while(cin>>n) { cout<<cal(n)<<endl; }}
0 0
- 本原串(map加快速幂)
- hdu 2197 本原串 (快速幂)
- HDU 本原串 (快速幂)
- hdu 2197 本原串(数论+快速幂)
- HDU 2197 本原串 (规律+快速幂)
- hdu 2197 本原串 找规律+快速幂+映射
- hdu 2197 本原串(递推,快速幂取模)
- hdu 2197 【本原串】
- HDU - 2197 本原串
- HDU 2197本原串
- 【HDU】 2197 本原串
- hdu 2197 本原串
- hdu-2197-本原串
- hdu 2197 本原串(容斥定理)
- HDU 2197 本原串 (数学+容斥)
- hdu 2197 本原串 思维
- (快速幂加素数判断)
- hdu2197 本原串 枚举因子 思维
- 创建git 仓库
- 表格中我不知道那些事!
- PPT中画折线
- OllyDBG教程
- 日期的国际化 和DateFormat / SimpleDateFormat 相互转换
- 本原串(map加快速幂)
- lintcode:Scramble String
- 数数
- JAVA原理学习
- VB 常用函数
- ArrayList 的线程安全问题
- 条款32 确定你的public继承塑模出is-a关系
- C++当中随机数的产生
- 看懂这道题,就学会指针了