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相关推荐

  1. 数论四之综合训练——Magic Pairs,Crime Management,Top Secret,组合数问题

    数论综合训练 Magic Pairs problem solution code CF107D Crime Management problem solution code UVA12183 Top ...

  2. 【Codeforces Round #519 by Botan Investments D】Mysterious Crime

    [链接] 我是链接,点我呀:) [题意] 相当于问你这m个数组的任意长度公共子串的个数 [题解] 枚举第1个数组以i为起点的子串. 假设i..j是以i开头的子串能匹配的最长的长度. (这个j可以给2. ...

  3. 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 ...

  4. 【CodeForces - 574B】Bear and Three Musketeers (枚举边,思维,优秀暴力)

    题干: Do you know a story about the three musketeers? Anyway, you will learn about its origins now. Ri ...

  5. CodeForces 375D Tree and Queries

    传送门:https://codeforces.com/problemset/problem/375/D 题意: 给你一颗有根树,树上每个节点都有其对应的颜色,有m次询问,每次问你以点v为父节点的子树内 ...

  6. 「日常训练」Bad Luck Island(Codeforces Round 301 Div.2 D)

    题意与分析(CodeForces 540D) 是一道概率dp题. 不过我没把它当dp做... 我就是凭着概率的直觉写的,还好这题不算难. 这题的重点在于考虑概率:他们喜相逢的概率是多少?考虑超几何分布 ...

  7. 【codeforces 812C】Sagheer and Nubian Market

    [题目链接]:http://codeforces.com/contest/812/problem/C [题意] 给你n个物品; 你可以选购k个物品;则 每个物品有一个基础价值; 然后还有一个附加价值; ...

  8. CodeForces 获得数据

    针对程序的输出可以看见 CodeForces :当输入.输出超过一定字符,会隐藏内容 所以:分若干个程序进行输入数据的获取 1. 1 for (i=1;i<=q;i++) 2 { 3 scanf ...

  9. codeforces水题100道 第二十七题 Codeforces Round #172 (Div. 2) A. Word Capitalization (strings)...

    题目链接:http://www.codeforces.com/problemset/problem/281/A 题意:将一个英文字母的首字母变成大写,然后输出. C++代码: #include < ...

  10. CodeForces 595A

    题目链接: http://codeforces.com/problemset/problem/595/A 题意: 一栋楼,有n层,每层有m户,每户有2个窗户,问这栋楼还有多少户没有睡觉(只要一个窗户灯 ...

最新文章

  1. jwt 私钥_JSON Web Token (JWT)生成Token及解密实战。
  2. 自学python需要买书吗-学习Python的正确姿势—基础教学,教科书该怎么买?
  3. AI:2020年6月22日北京智源大会演讲分享之认知神经基础专题论坛——13:40-14:20毕彦超教授《Knowledge representation in the Human brain》
  4. java 蓝桥杯算法训练 奇变的字符串(题解)
  5. 随想录(矩阵计算的几种方法)
  6. 简记:我的Scala学习之路
  7. 基于灰色模型GM的管道腐蚀预测 - 附代码
  8. 关于官方Reachability Demo理解
  9. DNF私服商业服搭建教程
  10. 高通SDX12:USB主模式调试及RTL8153驱动移植
  11. 【基础知识】【模块介绍】0.96寸OLED显示屏(SSD1306)基础命令和寻址方法
  12. 鲁大师2021年度PC硬件报告:AMD跑分超神,华米OV入局笔记本
  13. Symbian OS 源码下载方式
  14. 163免费企业邮箱服务地址
  15. Oracle HFM OHS服务无法启动
  16. Error converting data type...
  17. Java 递归查询部门树形结构数据
  18. 令人炸毛儿的MySQL隐式转换 - 无形之刃,最为致命
  19. 用matlab画三叶玫瑰,网上收到的用matlab画玫瑰花的代码怎么不行啊,报告错误,求大神...
  20. 【软件测试】测试用例的设计

热门文章

  1. Ubuntu18.04 sqlite3安装及其应用
  2. PyG教程(2):图数据
  3. matlab的RI是什么,LTE上报的CQI、PMI、RI分别有什么用
  4. Activity切换闪屏问题
  5. matlab convexhull,使用convex_hull计算体积为0
  6. python数据采集2-HTML解析
  7. 用python求圆的表面积_【用python写一组类(class)对应各种几何体(正方体,长方体,球,圆柱)的表面积和体积的编码】作业帮...
  8. 【CF1056D】Decorate Apple Tree
  9. 【优化算法】加权黑猩猩优化算法(WChOA)(Matlab代码实现)【与ChOA、PSO、WOA、BH、ALO、GA和GWO算法比较】
  10. 那些出其不意给你惊喜的点,重新感受for循环的爱,来自C#