loj6102 「2017 山东二轮集训 Day1」第三题

传送门:https://loj.ac/problem/6102

【题解】

贴一份zyz在知乎的回答吧 https://www.zhihu.com/question/61218881

其实是经典问题

# include <stdio.h>
# include <string.h>
# include <iostream>
# include <algorithm>

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;

const int N = 5e4 + 10, M = 1e6 + 10, F = 1e6;
const int mod = 1e9 + 7;

int n, a[N], f[F + 5], g[F + 5];
bool h[F + 5];

inline int pwr(int a, int b) {
    int ret = 1;
    while(b) {
        if(b&1) ret = 1ll * ret * a % mod;
        a = 1ll * a * a % mod;
        b >>= 1;
    }
    return ret;
}

int main() {
    cin >> n;
    for (int i=1; i<=n; ++i) scanf("%d", a+i);
    f[0] = 0, f[1] = g[1] = 1;
    for (int i=2; i<=F; ++i) {
        f[i] = f[i-1] + f[i-2];
        if(f[i] >= mod) f[i] -= mod;
        g[i] = f[i];
    }
    for (int i=1; i<=F; ++i) {
        int t = pwr(g[i], mod-2);
        for (int j=i+i; j<=F; j+=i)
            g[j] = 1ll * g[j] * t % mod;
    }
    for (int i=1; i<=n; ++i) h[a[i]] = 1;
    int ans = 1;
    for (int i=1; i<=F; ++i) {
        for (int j=i+i; j<=F; j+=i) h[i] |= h[j];
        if(h[i]) {
//            cout << i << ‘ ‘ << g[i] << endl;
            ans = 1ll * ans * g[i] % mod;
        }
    }
    cout << ans;
    return 0;
}

时间: 2024-08-06 11:58:26

loj6102 「2017 山东二轮集训 Day1」第三题的相关文章

「2018山东一轮集训」鸽子

窝也不知道为什么反着BFS就是对的啊QWQ #include<cstdio> #define ll long long using namespace std; const int N=2005; int n,k,m,B[2],E[2],H,T,px[N*N],py[N*N]; int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0}; bool M[N][N],v[N][N]; inline bool read(){ char ch=getchar(); while(ch!

「2018山东一轮集训」 Tree

为什么出题人这么毒瘤啊??!!一个分块还要带log的题非要出成n<=2*1e5....... 为了卡过最后两个点我做了无数常数优化,包括但不限于:把所有线段树改成 存差分的树状数组:把树剖求LCA的极小的log优化成rmq O(1)求LCA:根据测试情况手动调整siz的大小: 但就是死也卡不过去,算了算了QWQ (常规套路,先把1设成根建有根树) 这个题的主要思路就是 对节点的下标分块,设 f[i][j] 为 第i个块内所有点到点j的距离和,然后看如何快速的动态维护这个玩意.... 发现改动一条

Loj #6142. 「2017 山东三轮集训 Day6」A

link: https://loj.ac/problem/6142 推完一波式子之后发现求的是:ΣC(N,i)^2, 其中i是偶数. 然后就可以卢卡斯乱搞了,分奇偶和之前的答案合并就好了233. #include<bits/stdc++.h> #define ll long long #define maxn 1000010 #define ha 1000003 using namespace std; ll n; int num[10],len; int f[2],pre[2],inv[ma

SD 一轮集训 day1 carcar

可以发现每条边只能选一次或者两次,并且最后每个点的度数(∑邻接边选的次数和)都是偶数(代表有欧拉回路). 然后根据题意列一个 n 行 m+1 列的01矩阵,每一行代表一个异或方程组(每个点的度数是偶数),每一列(除了最后一列)代表一个变量(每条边是不是选2次),最后一列0/1代表这个点目前的度数是偶数还是奇数. 最后我们要求的就是方程所有解中逆字典序最小的解. 乍一看肯定是毫无思路,但是做了 [HAOI2018] 反色游戏 之后,就感觉这两个东西还是有点点共性的. 我们高斯消元的过程肯定是 i

SD 一轮集训 day1 lose

神TM有是结论题,我讨厌结论题mmp. 杨氏矩阵了解一下(建议去维基百科). 反正就是推柿子,使劲推,最后写起来有一点小麻烦,但是在草稿纸(然鹅我木有啊)上思路清晰的话还是没问题的. #include<cstdio> #include<cctype> #include<algorithm> #define ll long long using namespace std; const int maxn=2000000,ha=1e9+7; inline int read(

「清华集训2014」主旋律

「清华集训2014」主旋律 这个题好难难啊,我想了一个小时连50分都不会,只能去摸周指导了. 我们试图直接爆算集合 \(S\) 的非强连通导出子图数量,考虑将这个导出子图的所有强连通分量缩点后,一定是一个点数 \(\geq 2\) 的 \(\text{DAG}\) .即缩完以后至少要有一个入度为 \(0\) 的点,这个条件充分性显然,必要性考虑如果不存在入度为 \(0\) 的点,那么一定存在一个环,说明并没有将所有强连通分量缩掉.然后我们枚举入度为 \(0\) 的点集 \(T\) ,记 \(F(

「2017年教育部-永信至诚产学合作协同育人网络空间安全专业课程教学研讨会」参会总结

「2017年教育部-永信至诚产学合作协同育人网络空间安全专业课程教学研讨会」参会总结 网络空间安全导论 欢迎关注"rocedu"微信公众号(手机上长按二维码) 做中教,做中学,实践中共同进步! 原文地址:http://www.cnblogs.com/rocedu/p/7898629.html](http://www.cnblogs.com/rocedu/p/7898629.html) 推荐网站:博客园.新浪微博.扇贝背单词.DKY背单词小组.有道云笔记.豆瓣读书 版权声明:自由转载-非

RFID 电动二轮自行车的防盗系统—读头

RFID 电动二轮自行车的防盗系统-读头 在RFID电动自行车防盗系统中,2.4G的读头占有重要环节:关系到读标签跟将ID号传输到后台,在这里介绍一款2.4G RFID系统中无线链路的RFID收发芯片-SI24R1芯片. 现在介绍一下这款芯片的基本知识: Si24R1是一颗工作在2.4GHz ISM频段,专为低功耗无线场合设计,集成嵌入式ARQ基带协议引擎的无线收发器芯片.工作频率范围为2400MHz-2525MHz,共有126个1MHz带宽的信道. Si24R1采用GFSK/FSK数字调制与解

RFID 电动二轮自行车的防盗系统—标签

RFID 电动二轮自行车的防盗系统-标签 RFID电动二轮自行车的车身上或者骑着人,需要装配有源标签.该标签通过2.4G信道发送ID给读头,而SI24R2E是一款针对RFID有源卡行业涉及的,单发的2.4G频段RF射频芯片,目前主要针对低功耗的校讯通,2.4G停车场,电动车防盗方面应用广泛. SI24R2E的功能概述:   Si24R2E是一颗工作在2.4GHz ISM频段,专为低功耗有源RFID应用场合设计,集 成嵌入式发射基带的无线发射芯片.128次可编程NVM存储器以及自动发射模块.工作频