Luogu P3123 [USACO15OPEN]贝茜说哞Bessie Goes Moo

题目描述

Farmer John and Bessie the cow love to exchange math puzzles in their free time.

The last puzzle FJ gave Bessie was quite difficult and she failed to solve it.

Now she wants to get even with FJ by giving him a challenging puzzle.

Bessie gives FJ the expression (B+E+S+S+I+E)(G+O+E+S)(M+O+O)(B+E+S+S+I+E)(G+O+E+S)(M+O+O)(B+E+S+S+I+E)(G+O+E+S)(M+O+O) , containing the

seven variables B,E,S,I,G,O,MB,E,S,I,G,O,MB,E,S,I,G,O,M (the “OOO “ is a variable, not a zero). For each

variable, she gives FJ a list of up to 500 integer values the variable can

possibly take. She asks FJ to count the number of different ways he can assign

values to the variables so the entire expression evaluates to a multiple of 7.

Note that the answer to this problem can be too large to fit into a 32-bit

integer, so you probably want to use 64-bit integers (e.g., “long long”s in C or

C++).

  • 七个变量B,E,S,I,G,O,M;使得(B+E+S+S+I+E)(G+O+E+S)(M+O+O)被7整除的方案有多少种.

输入输出格式

输入格式:

The first line of the input contains an integer NNN . The next NNN lines each

contain a variable and a possible value for that variable. Each variable will

appear in this list at least once and at most 500 times. No possible value will

be listed more than once for the same variable. All possible values will be in

the range $-10^{5}$ to $10^{5}$.

输出格式:

Print a single integer, giving the number of ways FJ can assign values to

variables so the expression above evaluates to a multiple of 7.

输入输出样例

输入样例#1: 复制

10
B 2
E 5
S 7
I 10
O 16
M 19
B 3
G 1
I 9
M 2

输出样例#1: 复制

2

说明

The two possible assignments are

(B,E,S,I,G,O,M) = (2, 5, 7, 9, 1, 16, 19) -> 51,765
(B,E,S,I,G,O,M) = (2, 5, 7, 9, 1, 16, 2 ) -> 34,510

思路

  • 用 $f[i][j]$表示: 第i个字母变量所代表的数mod7==j的次数
  • 由于每个字母mod 7只可能有0~6共7种结果,所以直接7^7暴力枚举
  • $b[k]$表示第k个变量mod 7的值 i
  • $c[k]$表示输入中的数mod 7== i 的出现次数
  • 当s1,s2,s3中有一个为0时,就可以累加答案

代码

#include<cmath>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#define re register int
using namespace std;
int n,x;
char a[2],s[10];
long long ans,f[10][20],c[10],b[10];
inline int read(){
int x=0,w=1;
char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') w=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-48,ch=getchar();
return x*w;
}
void dfs(int k,long long sum) {
if(k>7) {
int s1=(b[1]+b[2]*2+b[3]*2+b[4])%7;
int s2=(b[5]+b[6]+b[2]+b[3])%7;
int s3=(b[7]+2*b[6])%7;
if(s1==0||s2==0||s3==0) ans=ans+sum;
return;
}
for(re i=0;i<=6;i++) {
b[k]=i;
c[k]=f[k][i];
if(c[k]==0) continue;
dfs(k+1,sum*c[k]);
}
}
int main() {
//freopen("p3123.in","r",stdin);
//freopen("p3123.out","w",stdout);
s[1]='B';s[2]='E';s[3]='S';s[4]='I';s[5]='G';s[6]='O';s[7]='M';
n=read();
for(re i=1;i<=n;i++) {
scanf("%s%d",a,&x);
for(re j=1;j<=7;j++)
if(a[0]==s[j]) f[j][(x%7+7)%7]++;
}
dfs(1,1);
printf("%lld\n",ans);
return 0;
}

最新文章

  1. pandas筛选0,3,6开头的行
  2. php 画图片
  3. Openstack的web管理端相关
  4. 基于bootstrap分页
  5. 高效开发 Android App 的 10 个建议(转)
  6. jqmobi 子菜单 高亮效果
  7. iOS-xib(使用XIB自定义一个UIView )
  8. 百度地图API开发指南
  9. An error occurred while collecting items to be installed session context was:(profile=DefaultProfile... 解决方案
  10. 【HDOJ】1097 A hard puzzle
  11. asp.net中生成缩略图并添加版权实例代码
  12. BZOJ2253 2010 Beijing wc 纸箱堆叠 CDQ分治
  13. BZOJ 2876 骑行川藏
  14. rac 实例被莫名重启的案例分析
  15. ubuntu12.04+fuerte 下跑通lsd-slam——数据集
  16. 橙色优学:2019年设计行业怎么样?UI设计行业前景分析
  17. (转)JVM——Java虚拟机架构
  18. python multithread task_done
  19. MFC之菜单
  20. 简单的HTML5 canvas游戏工作原理

热门文章

  1. java-处理大容量文本文件,行内分格符为TAB的方法
  2. 脱壳入门----脱ASPack壳保护的DLL
  3. C++ primer plus读书笔记——第9章 内存模型和名称空间
  4. 动态内存:delete作用于空指针
  5. mitmproxy 获取请求响应数据
  6. Docker------阿里云部署私有镜像仓库
  7. SPEC 2000 整形和浮点性能测试结果是各项基准程序得分的几何平均值,几何平均值是 n 个数连乘之 后再开 n 次根号
  8. 018.Python迭代器以及map和reduce函数
  9. ELK学习实验020:ELK使用kafka缓存
  10. Linux中级之keepalived配置