传送门

赛时用一个奇怪的方法过掉了

首先\(b_i\)的有效范围是\([0, k-1]\)

发现不同的\(a_i*b_i\)会有很多重的

考虑把\(a_i\%k\),然后由小到大排序

按顺序扫,如果某个\(a_i\)已经可以被某个\(a_j\%k\)的倍数表示出来,那这个\(a_i\)就无效化了

这个可以用埃氏筛实现

最后会剩下一些仍有效的\(a_i\),但由于一些性质(我不太懂)剩下的数会极少,一般只剩下一个

那就可以\(O(k^n)\)暴力处理了

这个性质很有趣,随机数据几乎卡不掉,跑了半个小时才跑出来一个剩10个数的

然后正解:

一个看着很显然但遇到题不容易想到的结论:

  • \(ax+by=z\) 有整数解的条件是 \(gcd(a, b)|z\)

所以 \((\sum a_i*b_i)\%k\) 就一定是 \(gcd(a_i, a_{i+1}, ...)\) 的倍数

那求个gcd,不断乘\(k\)就行了

所以我从哪能联想到这个结论啊

Code:

#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define N 1000100
#define ll long long
#define ld long double
#define usd unsigned
#define ull unsigned long long
//#define int long long #define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf, 1, 1<<21, stdin)), p1==p2?EOF:*p1++)
char buf[1<<21], *p1=buf, *p2=buf;
inline int read() {
int ans=0, f=1; char c=getchar();
while (!isdigit(c)) {if (c=='-') f=-f; c=getchar();}
while (isdigit(c)) {ans=(ans<<3)+(ans<<1)+(c^48); c=getchar();}
return ans*f;
} ll n, k;
ll a[N];
int q[N], top;
bool vis[N]; namespace force{
int lst[N], top2, cnt;
void dfs(int u, int sum) {
if (u>top2) {vis[sum]=1; return ;}
for (int i=0; i<k; ++i) dfs(u+1, (sum+1ll*lst[u]*i%k)%k);
}
void solve() {
vis[0]=1;
for (int i=1; i<=n; ++i) a[i]=read()%k;
sort(a+1, a+n+1);
for (int i=1; i<=n; ++i) {
if (a[i] && !vis[a[i]]) {
for (int j=1; j<k; ++j) vis[a[i]*j%k]=1;
lst[++top2]=a[i];
}
}
for (int i=0; i<k; ++i) if (vis[i]) ++cnt;
//cout<<"top2: "<<top2<<endl;
if (cnt==k) {
for (int i=0; i<k; ++i) if (vis[i]) q[++top]=i;
printf("%d\n", top);
for (int i=1; i<=top; ++i) printf("%d ", q[i]);
printf("\n");
exit(0);
}
dfs(1, 0);
for (int i=0; i<k; ++i) if (vis[i]) q[++top]=i;
printf("%d\n", top);
for (int i=1; i<=top; ++i) printf("%d ", q[i]);
printf("\n");
exit(0);
}
} namespace task1{
void solve() {
vis[0]=1;
for (int i=1; i<=n; ++i) a[i]=read()%k;
for (int i=1; i<=n; ++i) {
if (a[i] && !vis[a[i]]) {
for (int j=1; j<k; ++j) vis[a[i]*j%k]=1;
}
}
for (int i=0; i<k; ++i) if (vis[i]) q[++top]=i;
printf("%d\n", top);
for (int i=1; i<=top; ++i) printf("%d ", q[i]);
printf("\n");
exit(0);
}
} namespace task{
ll gcd(ll a, ll b) {return !b?a:gcd(b, a%b);}
void solve() {
for (int i=1; i<=n; ++i) a[i]=read();
ll t=a[1];
for (int i=2; i<=n; ++i) t=gcd(t, a[i]);
for (int i=0; i<k; ++i) vis[t*i%k]=1;
for (int i=0; i<k; ++i) if (vis[i]) q[++top]=i;
printf("%d\n", top);
for (int i=1; i<=top; ++i) printf("%d ", q[i]);
printf("\n");
exit(0);
}
} signed main()
{
#ifdef DEBUG
freopen("1.in", "r", stdin);
#endif n=read(); k=read();
task::solve(); return 0;
}

题解 math的更多相关文章

  1. 题解 Math teacher's homework

    题目传送门 题目大意 给出 \(n,k\) 以及 \(a_{1,2,...,n}\) ,求有多少个 \(m_{1,2,...,n}\) 满足 \(\forall i,m_i\le a_i\) 且 \( ...

  2. COGS 2188. [HZOI 2015] Math 题解

      题目描述: 给定n个数X1-Xn,求下面式子的值(整数部分): n<=107,xi<=109且互不相同. 分析: 其实一开始看见这道题我也吓傻了,k这么大,再说我又是数论鶸渣,打死也不 ...

  3. DZY Loves Math 系列详细题解

    BZOJ 3309: DZY Loves Math I 题意 \(f(n)\) 为 \(n\) 幂指数的最大值. \[ \sum_{i = 1}^{a} \sum_{j = 1}^{b} f(\gcd ...

  4. 算法题解之math类题

    Bulb Switcher 灯泡开关 思路:除了平方数以外,其他所有位置的灯泡最终都被开关了偶数次,因此最终都为0.问题等价于求1~n中平方数的个数. public class Solution { ...

  5. [CF846B]Math Show题解

    暴力一下就好啦! 枚举一下一共做多少次任务,剩下的时间将子任务排序,从头开始能取多少取多少就行了. 贴个代码 #include <cstdio> #include <algorith ...

  6. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  7. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  8. UNR #1 题解

    A. 争夺圣杯 还是想说一下,这题是原题啊...想做的人可以戳codechef上的MTMXSUM(懒得贴链接了,套了个壳,不过正常人应该都能看得出来) 显然异或输出没什么奇怪的性质... 考虑一个元素 ...

  9. toodifficult 题解

    名字听起来十分厉害啊...一道lzz的提交答案题. 提答题,我们看看题目,给出一个解密程序,叫你加密. 每个点有一个加密的sample和一些要加密的文本. 从题目中我们可以得到一些信息: 加密后一般为 ...

随机推荐

  1. B 站崩了,受害程序员聊聊

    非吃瓜,B 站事件始末分析 + 防治技术分享 大家好,我是鱼皮,昨天小破站崩了的事情相信很多朋友都听说了. 这要是搁以前,不爱吃瓜的我根本不会去关注这种事,崩了就崩了呗,反正天塌下来有程序员大佬们扛着 ...

  2. 为什么使用 LSTM 训练速度远大于 SimpleRNN?

    今天试验 TensorFlow 2.x , Keras 的 SimpleRNN 和 LSTM,发现同样的输入.同样的超参数设置.同样的参数规模,LSTM 的训练时长竟然远少于 SimpleRNN. 模 ...

  3. 视频场景切换检测的FPGA实现

    本文将继续讲述图像处理算法的FPGA实现,后续可能更新图像旋转(1080P).画中画.快速DCT等算法.视频场景切换检测常用于视频编解码领域,我选用的算法是双阈值灰度直方图检测法,起初在MATLAB上 ...

  4. datax的安装和使用(windows)

    github官方文档和项目:https://github.com/alibaba/DataX 下载后在windows环境下是可以直接用python编译执行的,但从github上下载的版本只支持pyth ...

  5. MapReduce学习总结之架构

    一.MapReduce1.x架构 1)jobTracker:JT 作业的管理者 将作业分解成一堆任务:Task(MapTask和ReduceTask) 将任务分派给TaskTracker(TT)运行 ...

  6. 简单配置nginx反向代理,实现跨域请求

    简单配置nginx去做反向代理,实现跨域请求 简单介绍nginx的nginx.conf最核心的配置,去做反向代理,实现跨域请求. 更多详细配置,参考nginx官方文档 先介绍几个nginx命令 打开n ...

  7. 第1天 Mark Down 学习及DOS命令

    Markdown学习 标题 "#加空格"几个#就表示几级标题 字体 helloworld!一两个两个*号 helloworld!一边一个*号 helloworld! 一边三个号 h ...

  8. 第三十一篇 -- 理一下.h和.cpp的关系

    今天突然想到一个问题,我们平时写代码会将代码进行分类,写到不同的cpp里,然后要用到那个类里面的函数,就直接include .h文件就好了.然后今天就在想,.h里面都是一些声明,它是怎么链接到.cpp ...

  9. Redis内部阻塞式操作有哪些?

    Redis实例在运行的时候,要和许多对象进行交互,这些不同的交互对象会有不同的操作.下面我们来看看,这些不同的交互对象以及相应的主要操作有哪些. 客户端:键值对的增删改查操作. 磁盘:生成RDB快照. ...

  10. OpenCV 之 特征检测

    特征,也称 兴趣点 或 关键点,如下:蓝框内区域平坦,无特征:黑框内有"边缘",红框内有"角点",后二者都可视为"特征" 角点作为一种特征, ...