传送门

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

首先\(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:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define INF 0x3f3f3f3f
  4. #define N 1000100
  5. #define ll long long
  6. #define ld long double
  7. #define usd unsigned
  8. #define ull unsigned long long
  9. //#define int long long
  10. #define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf, 1, 1<<21, stdin)), p1==p2?EOF:*p1++)
  11. char buf[1<<21], *p1=buf, *p2=buf;
  12. inline int read() {
  13. int ans=0, f=1; char c=getchar();
  14. while (!isdigit(c)) {if (c=='-') f=-f; c=getchar();}
  15. while (isdigit(c)) {ans=(ans<<3)+(ans<<1)+(c^48); c=getchar();}
  16. return ans*f;
  17. }
  18. ll n, k;
  19. ll a[N];
  20. int q[N], top;
  21. bool vis[N];
  22. namespace force{
  23. int lst[N], top2, cnt;
  24. void dfs(int u, int sum) {
  25. if (u>top2) {vis[sum]=1; return ;}
  26. for (int i=0; i<k; ++i) dfs(u+1, (sum+1ll*lst[u]*i%k)%k);
  27. }
  28. void solve() {
  29. vis[0]=1;
  30. for (int i=1; i<=n; ++i) a[i]=read()%k;
  31. sort(a+1, a+n+1);
  32. for (int i=1; i<=n; ++i) {
  33. if (a[i] && !vis[a[i]]) {
  34. for (int j=1; j<k; ++j) vis[a[i]*j%k]=1;
  35. lst[++top2]=a[i];
  36. }
  37. }
  38. for (int i=0; i<k; ++i) if (vis[i]) ++cnt;
  39. //cout<<"top2: "<<top2<<endl;
  40. if (cnt==k) {
  41. for (int i=0; i<k; ++i) if (vis[i]) q[++top]=i;
  42. printf("%d\n", top);
  43. for (int i=1; i<=top; ++i) printf("%d ", q[i]);
  44. printf("\n");
  45. exit(0);
  46. }
  47. dfs(1, 0);
  48. for (int i=0; i<k; ++i) if (vis[i]) q[++top]=i;
  49. printf("%d\n", top);
  50. for (int i=1; i<=top; ++i) printf("%d ", q[i]);
  51. printf("\n");
  52. exit(0);
  53. }
  54. }
  55. namespace task1{
  56. void solve() {
  57. vis[0]=1;
  58. for (int i=1; i<=n; ++i) a[i]=read()%k;
  59. for (int i=1; i<=n; ++i) {
  60. if (a[i] && !vis[a[i]]) {
  61. for (int j=1; j<k; ++j) vis[a[i]*j%k]=1;
  62. }
  63. }
  64. for (int i=0; i<k; ++i) if (vis[i]) q[++top]=i;
  65. printf("%d\n", top);
  66. for (int i=1; i<=top; ++i) printf("%d ", q[i]);
  67. printf("\n");
  68. exit(0);
  69. }
  70. }
  71. namespace task{
  72. ll gcd(ll a, ll b) {return !b?a:gcd(b, a%b);}
  73. void solve() {
  74. for (int i=1; i<=n; ++i) a[i]=read();
  75. ll t=a[1];
  76. for (int i=2; i<=n; ++i) t=gcd(t, a[i]);
  77. for (int i=0; i<k; ++i) vis[t*i%k]=1;
  78. for (int i=0; i<k; ++i) if (vis[i]) q[++top]=i;
  79. printf("%d\n", top);
  80. for (int i=1; i<=top; ++i) printf("%d ", q[i]);
  81. printf("\n");
  82. exit(0);
  83. }
  84. }
  85. signed main()
  86. {
  87. #ifdef DEBUG
  88. freopen("1.in", "r", stdin);
  89. #endif
  90. n=read(); k=read();
  91. task::solve();
  92. return 0;
  93. }

题解 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. excle名字后面直接跟别的出来

    名字后面直接跟别的出来 =IF($E6="","",VLOOKUP(E6,通讯录!$B$2:$D$1000,3,0)) $E6:是填写位置的地方 VLOOKUP ...

  2. NSIS 插件开发引发的思考

    支持NSIS的DLL扩展编程通用语法结构 #include <windows.h> #include <stdio.h> #define FORCE_SWITCH " ...

  3. python 10篇 操作mysql

    一.操作数据库 使用pip install pymysql,安装pymysql模块,使用此模块连接MySQL数据库并操作数据库. import pymysql host = 'ip地址' # 链接的主 ...

  4. python with (as)语句

    with语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的"清理"操作,释放资源,比如文件使用后自动关闭.线程中锁的自动获取和释放等. 例1:url = ...

  5. C标准库学习

    前言 C标准库源码可通过下列两个网站进行查看:The GNU C Library.Welcome to uClibc-ng! - Embedded C library 以下学习记录也是以这两个网站提供 ...

  6. uiautomator2 入门教程

    一.前言 在 Android 自动化测试方面,Google 提供了一个基于 Java 开发的库 UiAutomator,基本上支持所有的 Android 事件操作,使用简单. 在此基础上,有大佬开发出 ...

  7. 微信小程序云开发-云函数-云函数获取参数并实现运算

    1.编写加法运算的云函数addData 2.在本地小程序页面调用云函数

  8. Python在ubuntu16.04上环境搭建

    1.anaconda3安装 mkdir anaconda cd anaconda wget https://repo.continuum.io/archive/Anaconda3-4.4.0-Linu ...

  9. Qt Creator内qmake配置静态编译

    起因 利用QT Creator编写一些纯C/C++应用,默认配置下是动态编译 解决 解决起来很简单,这里只是附上配置备忘;-) msvc: { QMAKE_CFLAGS_RELEASE += /MT ...

  10. 多项式求值问题(horner规则)——Python实现

    # 多项式求值(Horner规则) # 输入:A[a0,a1,a2...an],x的值 # 输出:给定的x下多项式的值p   # Horner迭代形式实现 1 # 在此修改初值 2 A = [2, 6 ...