CF 900D Unusual Sequences

题目链接
\(Description\)
给定\(x,y\),求有多少个数列满足\(gcd(a_i)=x且\sum a_i=y\)。答案对\(10^9+7\)取模。

\(1≤x,y≤10^9\)



\(Solution\)
\(y\)如果不是\(x\)的倍数,答案为\(0\)

然后呢

令\(y/=x\),问题就变成了求有多少个数列满足\(gcd(a_i)=1且\sum ai=y'\)

如果没有\(gcd\)为\(1\)的限制?
隔板法可得\(ans=\sum_{i=0}^{y-1}C_{y-1}^i=2^{y-1}\)

令\(f(i)\)表示\(gcd(a_i)=1\)且和为\(i\)的方案数,\(g(i)\)表示和为\(i\)的方案数。
可得
\[g(i)=2^i-1,g(i)=\sum_{d|i}f(d)\]
要求的是\(f(i)\),所以把\(f(i)\)的一项单独拿出来
\[f(i)=g(i)-\sum_{d|i,d\not = i}f(d)\]
然后就可以从前往后递推了。

复杂度\(O(d(y/x)^2)\),其中\(d(x)\)为\(x\)的约数个数。

当然\[g(i)=\sum_{d|i}f(d)\]
就是一般的莫比乌斯反演的形式。
可以直接得出
\[f(i)=\sum_{d|i}\mu(d)g(\frac{i}{d})\]

#include<complex>
#include<cstdio>
using namespace std;
const int mod=1e9+7;
const int N=1e5+7;
int x,y,tot;
int d[N];
int qread()
{
    int x=0;
    char ch=getchar();
    while(ch<'0' || ch>'9')ch=getchar();
    while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x;
}
int GetMu(int x)
{
    if(x==1)return 1;
    int t=0,sqr=sqrt(x);
    for(int i=2;i<=sqr;i++)
        if(x%i==0)
        {
            t++;x/=i;
            if(x%i==0)return 0;
        }
    if(x>1)t++;
    return t&1?-1:1;
}
int Fpow(long long b,int p)
{
    long long res=1;
    for(;p;p>>=1,b=b*b%mod)
        if(p&1)res=res*b%mod;
    return res;
}
int main()
{
    scanf("%d%d",&x,&y);
    if(y%x){printf("0\n");return 0;}
    y/=x;
    for(int i=1;i*i<=y;i++)
        if(y%i==0)
        {
            d[++tot]=i;
            if(i*i!=y)d[++tot]=y/i;
        }
    long long ans=0;
    for(int i=1;i<=tot;i++)
        ans+=GetMu(y/d[i])*Fpow(2,d[i]-1);
    printf("%d\n",(ans%mod+mod)%mod);
    return 0;
}

原文地址:https://www.cnblogs.com/LeTri/p/10322503.html

时间: 2024-08-07 09:13:40

CF 900D Unusual Sequences的相关文章

Codeforces 900D Unusual Sequences 容斥原理

题目链接:900D  Unusual Sequences 题意: 给出两个数N,M.让你求数列(和为M,gcd为N)的个数. 题解: 首先,比较容易发现的是M%N如果不为零,那么一定不能构成这样的序列.那么可以设 k = M/N,则可以想象为用k个1来构成序列的个数,运用隔板原理可以求出k个1可以构成的序列总数为2^(k-1),但是这里面其实有不构成条件的(gcd>N)比方说6个相同的数(2,2,2)构成这样gcd就是2×N而不是N了.所以要减去这些数的情况,这样减的话发现不能用递归来做,要先记

D. Unusual Sequences(容斥)

D. Unusual Sequences 隔板法 + 容斥原理 1 //容斥(莫比乌斯反演) 2 #include <bits/stdc++.h> 3 using namespace std; 4 #define LL long long 5 const int mod = 1e9+7; 6 LL quickpow(LL a, LL b, LL mod){ 7 LL temp = a % mod, res = 1; 8 while(b){ 9 if(b & 1) res = res *

Unusual Sequences

题意: 求解合为 y 的总体 gcd 为 x 的正整数非空序列个数. 解法: 特判一下后,原问题等价于合为 s = y/x 的整体gcd为1的正整数序列个数. 1.$ans = \sum_{\sum{x_i} = s}{ [(x_1,...,x_n) = 1] } = \sum_{d|s}{\mu(s/d) \sum{[x_1+x_2+...+x_n = d]}} = \sum_{d|s}{\mu(s/d) 2^{d-1}}$ 2.记$f(m) = \sum_{\sum{x_i} = m}{ [

cf900D. Unusual Sequences(容斥 莫比乌斯反演)

题意 题目链接 Sol 首先若y % x不为0则答案为0 否则,问题可以转化为,有多少个数列满足和为y/x,且整个序列的gcd=1 考虑容斥,设\(g[i]\)表示满足和为\(i\)的序列的方案数,显然\(g[i] = 2^{i-1}\)(插板后每空位放不放) 同时还可以枚举一下gcd,设\(f[i]\)表示满足和为\(i\)且所有数的gcd为1的方案,\(g[i] = \sum_{d | i} f[\frac{n}{d}]\) 反演一下,\(f[i] = \sum_{d | i} \mu(d)

【CF900D】Unusual Sequences

题目 智力下降严重 显然要反演了呀 首先必须满足\(x|y\),否则答案是\(0\) 我们枚举这个数列的\(gcd\)是\(d\)或者\(d\)的倍数 于是答案就是 \[\sum_{x|d}[d|y]\mu(\frac{x}{d})g(\frac{y}{d})\] \(g(d)\)表示和为\(d\)的正整数数列的数量,显然就是插一下板,于是\(g(d)=\sum_{i=1}^d\binom{d-1}{i-1}=2^{d-1}\) 代码 #include<bits/stdc++.h> #defi

机器学习中使用的神经网络(一)

本系列博客根据Geoffrey Hinton课程Neural Network for Machine Learning总结. 课程网址为: https://www.coursera.org/course/neuralnets 1.Some examples of tasks best solved by learning 机器学习最适用的领域举例 - Recognizing patterns: 模式识别– Objects in real scenes 物体识别 – Facial identiti

Codeforces Round #450 (Div. 2) ABCD

这次还是能看的0 0,没出现一题掉分情况. QAQ前两次掉分还被hack了0 0,两行清泪. A. Find Extra One You have n distinct points on a plane, none of them lie on OY axis. Check that there is a point after removal of which the remaining points are located on one side of the OY axis. Input

(CF#257)B. Jzzhu and Sequences

Jzzhu has invented a kind of sequences, they meet the following property: You are given x and y, please calculate fn modulo 1000000007 (109?+?7). Input The first line contains two integers x and y (|x|,?|y|?≤?109). The second line contains a single i

一场CF的台前幕后(上)——转

前奏 大约4月份的时候,业界毒瘤pyx噔噔噔跑过来说:“酷爱!我YY了一道题!准备当CF的C” 我当时就被吓傻了."Yet another Chinese round?" “区间取模,区间求和” 感觉这题还不错?不过pyx嫌水了…… 好办!当时我刚刚出完动态仙人掌不久,于是一拍脑袋说:把这个问题出到仙人掌上去! 当然被pyx鄙视了…… 后来一直就没啥动静,直到5月底的CTSC. 试机的时候pyx给我看了套他出的神题……里面有一道题……我不小心读成了下面这个样子: “给定n个m维的模2意