题目描述

Blinker 有非常多的仰慕者,他给每个仰慕者一个正整数编号。而且这些编号还隐藏着特殊的意义,即编号的各位数字之积表示这名仰慕者对Blinker的重要度。 现在Blinker想知道编号介于某两个值A,B之间,且重要度为某个定值K的仰慕者编号和。


输入格式

输入的第一行是一个整数N,表示Blinker想知道的信息个数。 
接下来的N行,每行有三个数,A,B,K。表示 Blinker想知道编号介于A和B之间的,
重要度为K的仰慕者的编号和。


输出格式

输出N行,每行输出介于A和B之间,重要度为 K的仰慕者编号和。结果可能很大,
模上20120427。


提示

【数据范围】 
对于20%的数据,保证:  2<=A<=B<=1000000000,1<=N<=30 
对于50%的数据,保证:2<=A<=B<=1000000000000000000,1<=N<=30 
对于100%的数据,保证:  2<=A<=B<=1000000000000000000,1<=N<=5000


  • 题解:

    • 由于因子只有2 3 5 7 , 状态大概有3e4+,不超过4e4;
    • 用HASH_TABLE存下来;
    • 多组询问,先预处理$i$位的答案;
    • 对每组询问$dfs$统计答案,如果没有前导零并且没有抵达上界则直接返回,否则进一步$dfs$
    • 代码不太好些,注释里有关于变量的说明;
    • 注意$K=0$和$K \neq 0$最好分开统计;
    • $n$为位数上界,时间复杂度:$O(T*10n +n*4e4*10)$
  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. const int N=,M=4e4,sz=,mod=;
  5. ll A,B,K;
  6. int cnt,a[N],pw[N];
  7. int o,hd[sz],nt[sz];ll v[sz];
  8. void upd(int&x,int y){x+=y;if(x>=mod)x-=mod;}
  9. void add(ll x){
  10. int u=x%sz;
  11. for(int i=hd[u];i;i=nt[i])if(v[i]==x)return;
  12. nt[++o]=hd[u],hd[u]=o,v[o]=x;
  13. }
  14. int find(ll x){
  15. int u=x%sz;
  16. for(int i=hd[u];i;i=nt[i])if(v[i]==x)return i;
  17. return ;
  18. }//HASH表
  19. void dfs(int x,int y,ll z){
  20. if(x==)add(z);
  21. else{
  22. if(!y)return;
  23. for(int i=x;i<=;++i){
  24. dfs(i,y-,z);
  25. z*=y;
  26. }
  27. }
  28. }//dfs方案
  29. namespace Solve{
  30. int f[N][M],g[N][M];//f[位数][乘积]
  31. void init(){
  32. f[][]=;
  33. for(int i=;i<;++i)
  34. for(int j=;j<=o;++j)
  35. if(f[i][j]){
  36. for(int l=;l<=;++l){
  37. int y=find(v[j]*l);
  38. upd(f[i+][y],f[i][j]);
  39. upd(g[i+][y],(g[i][j]*+f[i][j]*l)%mod);
  40. }
  41. }
  42. }//预处理i位无限制的答案
  43. int cal1(int i,int j,int k,ll x,ll y){//已经枚举好的位数,前导零,上界,前i位的值,当前K
  44. if(i==cnt)return y==?x:;
  45. if(!k&&!j)return (1ll*x*pw[cnt-i]%mod*f[cnt-i][find(y)]%mod+g[cnt-i][find(y)])%mod;
  46. int re=,l=j?:,r=k?a[i+]:;
  47. for(int i1=l,t;i1<=r;++i1)if(!i1||y%i1==){
  48. ll y1=!i1?y:y/i1;
  49. upd(re, t=cal1(i+,j&&!i1,k&&i1==a[i+],(x*+i1)%mod,y1));
  50. }
  51. return re;
  52. }
  53. int cal0(int i,int j,int k,ll x,ll y){//前四个同cal1,y为前i为是否出现0
  54. if(i==cnt)return !y?x:;
  55. if(!k&&!j){
  56. if(!y)return (1ll*x*pw[cnt-i]%mod*pw[cnt-i]%mod+1ll*(pw[cnt-i]-)*pw[cnt-i]/%mod)%mod;//后面cnt-i任意;
  57. else return 1ll*x*pw[cnt-i]%mod*f[cnt-i][o]%mod+g[cnt-i][o];//后面cnt-i为乘积为0;
  58. }
  59. int re=,l=,r=k?a[i+]:;
  60. for(int i1=l;i1<=r;++i1){
  61. int y1=j&&!i1?:y*i1;
  62. upd(re, cal0(i+,j&&!i1,k&&i1==a[i+],(x*+i1)%mod,y1));
  63. }
  64. return re;
  65. }
  66. //注意理解一下两个方面:
  67. //是如何统计前i位达到上界,i+1位不是上界的答案的;(状态k)
  68. //是如何统计位数小于上界位数cnt的答案的; (状态j)
  69. //上界是如何被统计的(line44)
  70. }
  71. int main(){
  72. #ifndef ONLINE_JUDGE
  73. freopen("T2.in","r",stdin);
  74. freopen("T2.out","w",stdout);
  75. #endif
  76. dfs(,,);add();
  77. Solve::init();
  78. for(int i=pw[]=;i<=;++i)pw[i]=pw[i-]*%mod;
  79. int T;scanf("%d",&T);
  80. while(T--){
  81. int ans=;
  82. scanf("%lld%lld%lld",&A,&B,&K);A--;
  83. cnt=;while(A)a[++cnt]=A%,A/=;
  84. for(int i=;i<=cnt>>;++i)swap(a[i],a[cnt-i+]);
  85. ans-= K?Solve::cal1(,,,,K) : Solve::cal0(,,,,);
  86. cnt=;while(B)a[++cnt]=B%,B/=;
  87. for(int i=;i<=cnt>>;++i)swap(a[i],a[cnt-i+]);
  88. ans+= K?Solve::cal1(,,,,K) : Solve::cal0(,,,,);
  89. printf("%d\n",(ans%mod+mod)%mod);
  90. }
  91. return ;
  92. }

bzoj2757【scoi2012】Blinker的仰慕者的更多相关文章

  1. BZOJ2757 : [SCOI2012]Blinker的仰慕者

    BZOJ AC900题纪念~~ 若K>0,则 设f[i][j]表示i位数字,积为j的数字的个数 g[i][j]表示i位数字,积为j的数字的和 DP+Hash预处理 查询时枚举LCP然后统计贡献 ...

  2. BZOJ2758 : [SCOI2012]Blinker的噩梦

    首先将包含关系建树. 方法是将每个图形拆成上半边和下半边,从左往右扫描线,用Splay从下到上维护扫描线上所有图形. 每次加入一个新的图形$x$的时候,看看它下方第一个图形$y$,如果$y$是上半边, ...

  3. [BZOJ2758] [SCOI2012]Blinker的噩梦 扫描线+set

    题目大意:有n个圆或凸多边形,这些图形不会相交,每当走入或走出一个图形时需要异或上一个代价,有m组操作: 询问操作,每次询问从一个点走到另一个点时,需要的代价(初始代价为0) 修改操作,每次修改一个图 ...

  4. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  5. 近期概况&总结

    下午考完英语的学考就要放假啦,是衡中的假期啊QAQ 所以灰常的激动,一点也不想写题(我不会告诉你其实假期只有一个晚上.. 自从CTSC&APIO回来之后就一直在机房颓颓颓,跟着zcg学了很多新 ...

  6. bzoj2758【scoi2012】Blinker的的噩梦

    题目描述 一天Blinker醒来,发现自己成为了一个二维世界的点,而且被标记上了一个奇怪的值. 这个世界是由N个边界互不相交(且不相切)的图形组成,这里图形仅包括圆和凸多边形.每个图形还有一个权值.每 ...

  7. BZOJ 2756: [SCOI2012]奇怪的游戏 [最大流 二分]

    2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 3352  Solved: 919[Submit][Stat ...

  8. Bzoj2756 [SCOI2012]奇怪的游戏

    2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 3220  Solved: 886 Description ...

  9. 【BZOJ】【2756】【SCOI2012】奇怪的游戏

    网络流-最大流 这题……建模部分先略过 这道题是会卡时限的T_T俺的Dinic被卡了,在此放几篇很棒的讲网络流算法的文章,至于大家耳熟能详的论文就不放了…… http://www.cppblog.co ...

随机推荐

  1. Django_cookie+session

    一.cookie和session介绍 cookie 由服务器产生内容,浏览器收到请求后保存在本地:当浏览器再次访问时,浏览器会自动带上cookie,这样服务器就能通过cookie的内容来判断这个是“谁 ...

  2. java工程文件路径的问题

    String classpath = this.getClass().getResource("/").getPath().replaceFirst("/WEB-INF/ ...

  3. 第二阶段Sprint冲刺会议9

    进展:查看有关“共享平台”的资料,看如何实现上传下载功能,并尝试编码,没有成功.

  4. java 线程的简单理解

    想要实现线程可以继承Thread也可以实现接口runnable,在类中重写 run()方法在主函数调用start方法就可以开辟线程. 对于java对象都有一个wait()和notify().notif ...

  5. Codeforces Round #284 (Div. 1) C. Array and Operations 二分图最大匹配

    题目链接: http://codeforces.com/problemset/problem/498/C C. Array and Operations time limit per test1 se ...

  6. 浅学JavaScript

    JavaScript是互联网上最流行的脚本语言,可广泛用于服务器.PC.笔记本电脑智能手机等设备: 对事件的反应: <!DOCTYPE html> <html> <hea ...

  7. pygame学习笔记(1)——安装及矩形、圆型画图

    pygame是一个设计用来开发游戏的python模块,其实说白了和time.os.sys都是一样的东东.今天开始正式学习pygame,下载地址:www.pygame.org.下载后安装完成即可,在py ...

  8. Log4j读取配置文件并使用

    /** 设置配置路径从环境变量读取     * PropertyConfigurator类加载.properties文件的配置    * DOMConfigurator加载.xml文件的配置     ...

  9. ng-include 上ng-controller 无法获取控件

    A.Html内容如下 <div> <div kendo-grid="testGrid" k-options="testOptions"> ...

  10. 数据库性能优化之SQL语句优化(下)

    (1) 选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最 ...