bzoj2757【scoi2012】Blinker的仰慕者
题目描述
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)$
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=,M=4e4,sz=,mod=;
ll A,B,K;
int cnt,a[N],pw[N];
int o,hd[sz],nt[sz];ll v[sz];
void upd(int&x,int y){x+=y;if(x>=mod)x-=mod;}
void add(ll x){
int u=x%sz;
for(int i=hd[u];i;i=nt[i])if(v[i]==x)return;
nt[++o]=hd[u],hd[u]=o,v[o]=x;
}
int find(ll x){
int u=x%sz;
for(int i=hd[u];i;i=nt[i])if(v[i]==x)return i;
return ;
}//HASH表
void dfs(int x,int y,ll z){
if(x==)add(z);
else{
if(!y)return;
for(int i=x;i<=;++i){
dfs(i,y-,z);
z*=y;
}
}
}//dfs方案
namespace Solve{
int f[N][M],g[N][M];//f[位数][乘积]
void init(){
f[][]=;
for(int i=;i<;++i)
for(int j=;j<=o;++j)
if(f[i][j]){
for(int l=;l<=;++l){
int y=find(v[j]*l);
upd(f[i+][y],f[i][j]);
upd(g[i+][y],(g[i][j]*+f[i][j]*l)%mod);
}
}
}//预处理i位无限制的答案
int cal1(int i,int j,int k,ll x,ll y){//已经枚举好的位数,前导零,上界,前i位的值,当前K
if(i==cnt)return y==?x:;
if(!k&&!j)return (1ll*x*pw[cnt-i]%mod*f[cnt-i][find(y)]%mod+g[cnt-i][find(y)])%mod;
int re=,l=j?:,r=k?a[i+]:;
for(int i1=l,t;i1<=r;++i1)if(!i1||y%i1==){
ll y1=!i1?y:y/i1;
upd(re, t=cal1(i+,j&&!i1,k&&i1==a[i+],(x*+i1)%mod,y1));
}
return re;
}
int cal0(int i,int j,int k,ll x,ll y){//前四个同cal1,y为前i为是否出现0
if(i==cnt)return !y?x:;
if(!k&&!j){
if(!y)return (1ll*x*pw[cnt-i]%mod*pw[cnt-i]%mod+1ll*(pw[cnt-i]-)*pw[cnt-i]/%mod)%mod;//后面cnt-i任意;
else return 1ll*x*pw[cnt-i]%mod*f[cnt-i][o]%mod+g[cnt-i][o];//后面cnt-i为乘积为0;
}
int re=,l=,r=k?a[i+]:;
for(int i1=l;i1<=r;++i1){
int y1=j&&!i1?:y*i1;
upd(re, cal0(i+,j&&!i1,k&&i1==a[i+],(x*+i1)%mod,y1));
}
return re;
}
//注意理解一下两个方面:
//是如何统计前i位达到上界,i+1位不是上界的答案的;(状态k)
//是如何统计位数小于上界位数cnt的答案的; (状态j)
//上界是如何被统计的(line44)
}
int main(){
#ifndef ONLINE_JUDGE
freopen("T2.in","r",stdin);
freopen("T2.out","w",stdout);
#endif
dfs(,,);add();
Solve::init();
for(int i=pw[]=;i<=;++i)pw[i]=pw[i-]*%mod;
int T;scanf("%d",&T);
while(T--){
int ans=;
scanf("%lld%lld%lld",&A,&B,&K);A--;
cnt=;while(A)a[++cnt]=A%,A/=;
for(int i=;i<=cnt>>;++i)swap(a[i],a[cnt-i+]);
ans-= K?Solve::cal1(,,,,K) : Solve::cal0(,,,,);
cnt=;while(B)a[++cnt]=B%,B/=;
for(int i=;i<=cnt>>;++i)swap(a[i],a[cnt-i+]);
ans+= K?Solve::cal1(,,,,K) : Solve::cal0(,,,,);
printf("%d\n",(ans%mod+mod)%mod);
}
return ;
}
bzoj2757【scoi2012】Blinker的仰慕者的更多相关文章
- BZOJ2757 : [SCOI2012]Blinker的仰慕者
BZOJ AC900题纪念~~ 若K>0,则 设f[i][j]表示i位数字,积为j的数字的个数 g[i][j]表示i位数字,积为j的数字的和 DP+Hash预处理 查询时枚举LCP然后统计贡献 ...
- BZOJ2758 : [SCOI2012]Blinker的噩梦
首先将包含关系建树. 方法是将每个图形拆成上半边和下半边,从左往右扫描线,用Splay从下到上维护扫描线上所有图形. 每次加入一个新的图形$x$的时候,看看它下方第一个图形$y$,如果$y$是上半边, ...
- [BZOJ2758] [SCOI2012]Blinker的噩梦 扫描线+set
题目大意:有n个圆或凸多边形,这些图形不会相交,每当走入或走出一个图形时需要异或上一个代价,有m组操作: 询问操作,每次询问从一个点走到另一个点时,需要的代价(初始代价为0) 修改操作,每次修改一个图 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 近期概况&总结
下午考完英语的学考就要放假啦,是衡中的假期啊QAQ 所以灰常的激动,一点也不想写题(我不会告诉你其实假期只有一个晚上.. 自从CTSC&APIO回来之后就一直在机房颓颓颓,跟着zcg学了很多新 ...
- bzoj2758【scoi2012】Blinker的的噩梦
题目描述 一天Blinker醒来,发现自己成为了一个二维世界的点,而且被标记上了一个奇怪的值. 这个世界是由N个边界互不相交(且不相切)的图形组成,这里图形仅包括圆和凸多边形.每个图形还有一个权值.每 ...
- BZOJ 2756: [SCOI2012]奇怪的游戏 [最大流 二分]
2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 3352 Solved: 919[Submit][Stat ...
- Bzoj2756 [SCOI2012]奇怪的游戏
2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 3220 Solved: 886 Description ...
- 【BZOJ】【2756】【SCOI2012】奇怪的游戏
网络流-最大流 这题……建模部分先略过 这道题是会卡时限的T_T俺的Dinic被卡了,在此放几篇很棒的讲网络流算法的文章,至于大家耳熟能详的论文就不放了…… http://www.cppblog.co ...
随机推荐
- 搭建 Digital Ocean 服务器
作为程序员,搭建属于自己的服务器可以部署自己的网站,可以配置代理***,了解国际前沿科技:一些高性能的服务器还可以完成一些云计算.深度学习模型的训练任务. DigitalOcean 服务启动 注册 D ...
- sqli-labs学习笔记 DAY5
DAY 5 sqli-labs lesson 26a 闭合符号为单引号和括号,并且不回显错误,如果服务器是Linux,尝试%a0代替空格,这里尝试使用布尔型 数据库名长度:?id=1')&&a ...
- sar命令详解
基础命令学习目录首页 原文链接:http://lovesoo.org/linux-sar-command-detailed.html sar(System Activity Reporter系统活动情 ...
- 欢迎来怼--第三十六次Scrum会议
一.小组信息 队名:欢迎来怼 小组成员 队长:田继平 成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文 小组照片 二.开会信息 时间:2017/12/1 11:35~11:55,总计20min. 地点 ...
- (第十一周)Beta—review阶段成员贡献分
项目名:食物链教学工具 组名:奋斗吧兄弟 组长:黄兴 组员:李俞寰.杜桥.栾骄阳.王东涵 个人贡献分=基础分+表现分 基础分=5*5*0.5/5=2.5 成员得分如下: 成员 基础分 表现分 个人贡献 ...
- vs2013+python+ cocos2d-x-3.3rc0环境搭建
1.vs2013安装一路next,安装即可,时间1~2个小时 2.解压cocos2d-x-3.3rc0 build文件夹里会有名为 cocos2d-win32.vc2012的sln文件 打开 ...
- Leetcode题库——15.三数之和
@author: ZZQ @software: PyCharm @file: threeSum.py @time: 2018/10/6 19:47 说明:给定一个包含 n 个整数的数组 nums,判断 ...
- slf4j+log4j的初次使用
关于这两者的组合应用带来的好处,google都有 就不说了. 首先说下配置, 工作笔记:在myeclipse 中创建一个java project 创建一个 TestSlf4J 类 package co ...
- Answer the questions(回答自己的问题)
第一章: 问题:我们现在学了这个专业,如果想全面去了解,应该还要学习哪些课程? 回答:其实软件工程只是一个比较大的范畴,以后如果要出去工作,我们还要细分,比如说开发安卓,开发游戏,web架构方面等很多 ...
- PHP 多进程开发
pcntl_fork(); https://blog.csdn.net/wujiangwei567/article/details/77006724 https://blog.csdn.net/qq_ ...