Crime Management CodeForces - 107D
Crime Management CodeForces - 107D
问题描述: Zeyad 想要在埃及犯下N项罪行并且不想受到惩罚。有若干种类的罪行。例如,行贿是一项罪行但是当行贿重复两次的时候就不被认为是犯罪。因此,行贿在犯偶数次的时候不被当做犯罪。超速是一项罪行,但是当重复的次数是五的倍数的时候就不被认为是犯罪。
更特别的,现在已知有C个犯罪的条件。每个条件描述罪行的种类Ti和倍数Mi。如果Zeyad的犯Ti这罪名的次数是Mi的倍数,那么Zeyad就不会因此受到惩罚。有些罪名可能在条件中出现多次。那么只要满足至少一个条件Zeyad就不会受罚。当然如果Zeyad犯某种罪行的次数为0,他自然由于遵守法律而不会受罚。
现在Zeyad想知道他有多少种犯罪方式使得他恰好犯下n次罪却不会受到任何惩罚。
犯罪的顺序是有关系的。更正式的说,两个犯罪序列W1与W2被认为相同,当且仅当对于所有 1 ≤ i ≤ n,w1i = w2i成立。
输入格式:第一行有两个整数n,c 分别表示Zeyad想要犯罪的次数和他所知的条件的数目。紧接着是c个条件。共有26种罪名,分别用A-Z表示。每个条件包含一个大写字母表示罪名的类型和一个正整数表示倍数。所有条件中倍数的乘积不超过123。某些条件可以出现多次。当倍数是1时表示无论犯罪多少次都不会受到惩罚。显而易见,对于那些没有在条件中列出的罪名Zeyad不会考虑去犯它们因为这会不可避免地受到惩罚。
输出格式:输出一个非负整数,表示Zeyad恰好犯下n次罪却不会受到任何惩罚的犯罪方式数目模12345的值。
数据规模和约定: 0 ≤ n ≤ 1018, 0 ≤ c ≤ 1000
题解:此题最重要的一点是π(d)<=123。令p[i]为字母i所有d的乘积。p[i]<=123
f[i][a][b]…[z]:表示长度为i的字符串,‘A’个数 mod p[1] 等于a,‘B’个数 mod p[2] 等于b ……‘Z’个数 mod p[26] 等于z的情况总数。
因为π(d)<=123,所以每个n最多有123种状态。那么,把状态全部爆搜出来之后编号,就可以用一个123*123的矩阵来表示状态的转移。答案为矩阵的n次方。
坑点:n=0时一定有一种情况。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<vector>
#define pb push_back
using namespace std;
typedef long long ll;
const int mod=12345;
const int N=1000+5;
const int L=123;
template <class T>
inline void getin(T&num){char c;bool flag=0;num=0;while((c=getchar())<'0'||c>'9')if(c=='-')flag=1;while(c>='0'&&c<='9'){num=num*10+c-48;c=getchar();}if(flag) num=-num;//cin>>num;
}
ll n;
map<vector<int>,int> num;
vector<int> letter,let[L+5],mo[30];
int m,x,d,cnt=1,p[30],vis[30];
char str[2];bool zero[30];
inline void add(ll&a,ll b){a+=b;if(a>=mod)a-=mod;}
struct matrix{ll mat[L+5][L+5];inline void Init(){memset(mat,0,sizeof mat);}inline void One(){memset(mat,0,sizeof mat);for(int i=1;i<=cnt;i++) mat[i][i]=1;}matrix operator * (const matrix&a)const{matrix ret;ret.Init();for(int i=1;i<=cnt;i++)for(int j=1;j<=cnt;j++)for(int k=1;k<=cnt;k++)add(ret.mat[i][j],mat[i][k]*a.mat[k][j]%mod);return ret;}matrix operator *= (const matrix&a){return (*this)=(*this)*a;}matrix operator ^ (const ll b)const{matrix ret,tep;ll p=b;ret.One(),tep=(*this);while(p){if(p&1) ret*=tep;tep*=tep,p>>=1;}return ret;}matrix operator ^= (const ll b){return (*this)=(*this)^b;}
}statu;
void dfs(int x){if(x==27){//printf("%d\n",cnt);num[letter]=++cnt;for(int i=0;i<=26;i++)let[cnt].pb(letter[i]);return ;}if(!p[x]) return dfs(x+1);for(int i=0;i<p[x];i++)letter[x]=i,dfs(x+1);
}
void build(int x){if(x==27){int id=num[letter];vector<int> tep;for(int i=0;i<=26;i++)tep.pb(letter[i]);for(int i=1;i<=26;i++){ if(!p[i]) continue ;int to=(tep[i]+1)%p[i];swap(tep[i],to);add(statu.mat[id][num[tep]],1);swap(tep[i],to);}return ;}if(!p[x]) return build(x+1);for(int i=0;i<p[x];i++)letter[x]=i,build(x+1);
}
inline bool check(int p){for(int i=1;i<=26;i++){int siz=mo[i].size();if(!siz){if(!let[p][i]) continue ;else return 0;}bool flag=0;for(int j=0;j<siz;j++){if(!mo[i][j]){if(!let[p][i]){flag=1;break ;}continue ;}if(let[p][i]%mo[i][j]==0){flag=1;break ;}}if(!flag) return 0;}return 1;
}
int main(){getin(n),getin(m);if(!n) puts("1"),exit(0);//坑if(!m) puts("0"),exit(0);letter.pb(0);for(int i=1;i<=26;i++)p[i]=1,letter.pb(0);for(int i=1;i<=m;i++){scanf("%s%d",str,&d);if(!d) zero[str[0]-'A'+1]=1;else p[str[0]-'A'+1]*=d;mo[str[0]-'A'+1].pb(d);vis[str[0]-'A'+1]++;}for(int i=1;i<=26;i++)if(zero[i]&&vis[i]==1) p[i]=0;for(int i=1;i<=26;i++)if(!vis[i]) p[i]=0;dfs(1);for(int i=1;i<=26;i++) letter[i]=0;build(1);for(int i=1;i<=26;i++) letter[i]=0;for(int i=1;i<=26;i++){if(!p[i]) continue ;letter[i]=1%p[i];if(num.count(letter))add(statu.mat[1][num[letter]],1);letter[i]=0;}for(int i=1;i<=26;i++) letter[i]=0;statu^=n;ll ans=0;for(int i=2;i<=cnt;i++)if(check(i))add(ans,statu.mat[1][i]);cout<<ans<<'\n';return 0;
}
Crime Management CodeForces - 107D相关推荐
- 数论四之综合训练——Magic Pairs,Crime Management,Top Secret,组合数问题
数论综合训练 Magic Pairs problem solution code CF107D Crime Management problem solution code UVA12183 Top ...
- 【Codeforces Round #519 by Botan Investments D】Mysterious Crime
[链接] 我是链接,点我呀:) [题意] 相当于问你这m个数组的任意长度公共子串的个数 [题解] 枚举第1个数组以i为起点的子串. 假设i..j是以i开头的子串能匹配的最长的长度. (这个j可以给2. ...
- Codeforces Round #102 (Div. 1) A. Help Farmer 暴力分解
A. Help Farmer 题目连接: http://www.codeforces.com/contest/142/problem/A Description Once upon a time in ...
- 【CodeForces - 574B】Bear and Three Musketeers (枚举边,思维,优秀暴力)
题干: Do you know a story about the three musketeers? Anyway, you will learn about its origins now. Ri ...
- CodeForces 375D Tree and Queries
传送门:https://codeforces.com/problemset/problem/375/D 题意: 给你一颗有根树,树上每个节点都有其对应的颜色,有m次询问,每次问你以点v为父节点的子树内 ...
- 「日常训练」Bad Luck Island(Codeforces Round 301 Div.2 D)
题意与分析(CodeForces 540D) 是一道概率dp题. 不过我没把它当dp做... 我就是凭着概率的直觉写的,还好这题不算难. 这题的重点在于考虑概率:他们喜相逢的概率是多少?考虑超几何分布 ...
- 【codeforces 812C】Sagheer and Nubian Market
[题目链接]:http://codeforces.com/contest/812/problem/C [题意] 给你n个物品; 你可以选购k个物品;则 每个物品有一个基础价值; 然后还有一个附加价值; ...
- CodeForces 获得数据
针对程序的输出可以看见 CodeForces :当输入.输出超过一定字符,会隐藏内容 所以:分若干个程序进行输入数据的获取 1. 1 for (i=1;i<=q;i++) 2 { 3 scanf ...
- codeforces水题100道 第二十七题 Codeforces Round #172 (Div. 2) A. Word Capitalization (strings)...
题目链接:http://www.codeforces.com/problemset/problem/281/A 题意:将一个英文字母的首字母变成大写,然后输出. C++代码: #include < ...
- CodeForces 595A
题目链接: http://codeforces.com/problemset/problem/595/A 题意: 一栋楼,有n层,每层有m户,每户有2个窗户,问这栋楼还有多少户没有睡觉(只要一个窗户灯 ...
最新文章
- jwt 私钥_JSON Web Token (JWT)生成Token及解密实战。
- 自学python需要买书吗-学习Python的正确姿势—基础教学,教科书该怎么买?
- AI:2020年6月22日北京智源大会演讲分享之认知神经基础专题论坛——13:40-14:20毕彦超教授《Knowledge representation in the Human brain》
- java 蓝桥杯算法训练 奇变的字符串(题解)
- 随想录(矩阵计算的几种方法)
- 简记:我的Scala学习之路
- 基于灰色模型GM的管道腐蚀预测 - 附代码
- 关于官方Reachability Demo理解
- DNF私服商业服搭建教程
- 高通SDX12:USB主模式调试及RTL8153驱动移植
- 【基础知识】【模块介绍】0.96寸OLED显示屏(SSD1306)基础命令和寻址方法
- 鲁大师2021年度PC硬件报告:AMD跑分超神,华米OV入局笔记本
- Symbian OS 源码下载方式
- 163免费企业邮箱服务地址
- Oracle HFM OHS服务无法启动
- Error converting data type...
- Java 递归查询部门树形结构数据
- 令人炸毛儿的MySQL隐式转换 - 无形之刃,最为致命
- 用matlab画三叶玫瑰,网上收到的用matlab画玫瑰花的代码怎么不行啊,报告错误,求大神...
- 【软件测试】测试用例的设计
热门文章
- Ubuntu18.04 sqlite3安装及其应用
- PyG教程(2):图数据
- matlab的RI是什么,LTE上报的CQI、PMI、RI分别有什么用
- Activity切换闪屏问题
- matlab convexhull,使用convex_hull计算体积为0
- python数据采集2-HTML解析
- 用python求圆的表面积_【用python写一组类(class)对应各种几何体(正方体,长方体,球,圆柱)的表面积和体积的编码】作业帮...
- 【CF1056D】Decorate Apple Tree
- 【优化算法】加权黑猩猩优化算法(WChOA)(Matlab代码实现)【与ChOA、PSO、WOA、BH、ALO、GA和GWO算法比较】
- 那些出其不意给你惊喜的点,重新感受for循环的爱,来自C#