CodeForces
来源:互联网 发布:任我行软件 编辑:程序博客网 时间:2024/06/06 12:55
题意:求区间内,有多少个完美数
解题思路:数位Dp经典题。类似不要13这道题。这里的难点是如何表示能否被整除。其实只用判断能否被2520整除即可。庆祝下……终于搞懂完美数了。
#include<iostream>#include<deque>#include<memory.h>#include<stdio.h>#include<map>#include<string.h>#include<algorithm>#include<vector>#include<math.h>#include<stack>#include<queue>#include<set>#include<bitset>using namespace std;typedef long long int ll;ll dp[40][50][3000];//第i个数,前i个数字的最小公倍数,余数。int dig[40];map<int,int> m;//映射int gcd(int a,int b){ if(!b) return a; else return gcd(b,a%b);}int lcm(int a,int b){ return a/gcd(a,b)*b;}//具体可以参考不要13这道题。ll dfs(int pos,int sta,int mod,bool limit){ if(pos==0) return mod%sta==0; //记忆化搜索 if(!limit && dp[pos][m[sta]][mod]!=-1) return dp[pos][m[sta]][mod]; //循环遍历下一位的每一个数字,end记录最大能达到的数 int end=limit?dig[pos]:9; ll ans=0; for(int i=0;i<=end;i++){ if(i!=0) ans+=dfs(pos-1,lcm(sta,i),(mod*10+i)%2520,limit&&i==end); else ans+=dfs(pos-1,sta,(mod*10+i)%2520,limit&&i==end); } if(!limit) dp[pos][m[sta]][mod]=ans; return ans; }ll solve(ll x){ int pos=1; while(x){ dig[pos++]=x%10; x/=10; } return dfs(pos-1,1,0,1);}int main(){ int cnt=0; for(int i=1;i<=2520;i++) if(2520%i==0) m[i]=cnt++; memset(dp,-1,sizeof(dp)); ll l,r; int t; scanf("%d",&t); for(int qqq=1;qqq<=t;qqq++){ scanf("%I64d%I64d",&l,&r); printf("%I64d\n",solve(r)-solve(l-1)); } return 0;}
阅读全文
0 0
- codeforces~~~
- Codeforces
- codeforces
- Codeforces
- codeforces
- codeforces
- Codeforces
- Codeforces
- CodeForces
- CodeForces
- CodeForces
- CodeForces
- CodeForces
- Codeforces
- Codeforces
- Codeforces
- Codeforces
- Codeforces
- select标签加超链接的三种实现方法
- python多线程与进程
- 用swing 实现Icon 图标
- P1601 A+B Problem(高精)
- Java 注解一
- CodeForces
- 出场、入场动画大全,基于NineOldAndroids轻松实现动画效果
- MySQL ALTER命令(修改数据表相关)
- EA&UML日拱一卒-状态图::迁移
- 设计模式笔记之适配器模式
- Ubuntu常用命令大全
- PATH记录
- C#223课的主要内容
- 静态代理模式的源代码