Problem A: 青春野狼不做理性小魔女的梦

题意

给一个长为\(k\)的序列\(A\)和一个数\(n\),给出一部分\(A_i\)的值,另一部分为\(-1\),代表不知道这个\(A_i\)是多少,求满足\(\sum\limits_{i=1}^kA_ix_i\equiv 1\pmod m\)有整数解条件下的方案数,数是这么填的\(1\le m\le n,1 \le A_i\le m\),填\(m\)和不知道的\(A_i\)

说明

对\(10^9+7\)取模

对所有数据\(1\le k\le 50,1\le n\le 10^9,-1\le A_i\le 10^9\)


当时就想到了[HAOI2018]奇怪的背包

然后就知道需要\(\gcd(A_1,A_2,\dots,m)=1\),注意要把\(A_i=0\)的先扔出去。

但是那个题是\(dp\),把约数丢进去当状态就可以了,受到思维的影响,我就没从\(dp\)的坑里出去...成功的忽略了这个题推式子的本质。

设\(g_i\)代表模数为\(i\)时的答案

需要分情况讨论,如果所有的\(A_i=-1\)

\[\begin{aligned}
g_n&=\sum_{i_1=1}^n\sum_{i_2=1}^n\cdots\sum_{i_k=1}^n[\gcd(i_1,i_2,\dots,i_n,n)=1]\\
&=\sum_{d=1}^n\mu(d)\sum_{i_1=1}^n\sum_{i_2=1}^n\cdots\sum_{i_k=1}^n[d|\gcd(i_1,i_2,\dots,i_n,n)]\\
&=\sum_{d|n}\mu(d)(\frac{n}{d})^k
\end{aligned}
\]

\[F(n)=\sum_{i=1}^n i^k
\]

那么答案为

\[\begin{aligned}
ans&=\sum_{i=1}^n\sum_{d|i}\mu(d)(\frac{i}{d})^k\\
&=\sum_{d=1}^n\mu(d)\sum_{d|i}(\frac{i}{d})^k\\
&=\sum_{d=1}^n\mu(d)F(\lfloor\frac{n}{d}\rfloor)
\end{aligned}
\]

前面的\(\mu\)杜教筛搞一下,后面的\(F\)拉格朗日插值搞一下,复杂度并不会算..

如果不是所有的\(A_i=-1\),设所有非\(-1\)的\(A_i\)的\(\gcd\)是\(s\),那么式子可以推出来是

\[\sum_{d|s}\mu(d)F(\lfloor\frac{n}{d}\rfloor)
\]


Code:

#include <cstdio>
#include <algorithm>
#include <unordered_map>
std::unordered_map <int,int> Mu;
const int N=2e6+1;
const int mod=1e9+7;
const int M=55;
int pri[N],ispri[N],mu[N],cnt;
int k,n,A[M],fl[M],fr[M],fac[M],inv[M],py[M],s=-1;
#define add(a,b) ((a+b)%mod)
#define mul(a,b) (1ll*(a)*(b)%mod)
int qp(int d,int k){int f=1;while(k){if(k&1)f=mul(f,d);d=mul(d,d),k>>=1;}return f;}
void init()
{
k+=2,fac[0]=1;
for(int i=1;i<=k;i++) py[i]=add(py[i-1],qp(i,k-2)),fac[i]=mul(fac[i-1],i);
inv[k]=qp(fac[k],mod-2);
for(int i=k-1;~i;i--) inv[i]=mul(inv[i+1],i+1);
mu[1]=1;
for(int i=2;i<N;i++)
{
if(!ispri[i])
{
pri[++cnt]=i;
mu[i]=-1;
}
for(int j=1;j<=cnt&&i*pri[j]<N;j++)
{
int x=i*pri[j];
ispri[x]=1;
if(i%pri[j])
mu[x]=-mu[i];
else
break;
}
}
for(int i=2;i<N;i++) mu[i]+=mu[i-1];
}
int Sum(int n)
{
if(n<N) return mu[n];
if(Mu.find(n)!=Mu.end()) return Mu[n];
int ret=1;
for(int r,l=2;l<=n;l=r+1)
{
r=n/(n/l);
ret-=(r+1-l)*Sum(n/l);
}
return Mu[n]=ret;
}
int getF(int n)//\sum_{i=1}^n i^k
{
if(n<=k) return py[n];
fl[0]=fr[k+1]=1;
for(int i=1;i<=k;i++) fl[i]=mul(fl[i-1],n-i);
for(int i=k;i;i--) fr[i]=mul(fr[i+1],n-i);
int ret=0;
for(int i=1;i<=k;i++)
ret=add(ret,mul(k-i&1?-1:1,mul(py[i],mul(mul(fl[i-1],fr[i+1]),mul(inv[i-1],inv[k-i])))));
return ret;
}
int gcd(int a,int b){return b?gcd(b,a%b):a;}
void work1()
{
int ans=0;
for(int l=1,r;l<=n;l=r+1)
{
r=n/(n/l);
ans=add(ans,mul(add(Sum(r),mod-Sum(l-1)),getF(n/l)));
}
ans=add(ans,mod);
printf("%d\n",ans);
}
int getmu(int n)
{
int ret=1;
for(int i=1;pri[i]*pri[i]<=n;i++)
if(n%pri[i]==0)
{
ret=-ret;
n/=pri[i];
while(n%pri[i]==0) n/=pri[i],ret=0;
}
if(n!=1) ret=-ret;
return ret;
}
void work2()
{
int ans=0,i=1;
for(i=1;i*i<s;i++)
{
if(s%i) continue;
int t=s/i;
ans=add(ans,mul(getmu(i),getF(n/i)));
ans=add(ans,mul(getmu(t),getF(n/t)));
}
if(i*i==s)
ans=add(ans,mul(getmu(i),getF(n/i)));
ans=add(ans,mod);
printf("%d\n",ans);
}
int main()
{
int k_;scanf("%d%d",&k_,&n);
for(int a,i=1;i<=k_;i++)
{
scanf("%d",&a);
if(a) A[++k]=a;
}
std::sort(A+1,A+1+k);
if(!k||A[k]==-1) return init(),work1(),0;//全是-1
while(k&&~A[k]) if(~s) s=gcd(s,A[k]?A[k]:s),--k;else s=A[k--];
init();
work2();
return 0;
}

2018.12.26

广二模拟赛 Problem A: 青春野狼不做理性小魔女的梦 解题报告的更多相关文章

  1. 模拟赛 Problem 1 高级打字机(type.cpp/c/pas)

    Problem 1 高级打字机(type.cpp/c/pas) [题目描述] 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序 ...

  2. 模拟赛 Problem 3 经营与开发(exploit.cpp/c/pas)

    Problem 3 经营与开发(exploit.cpp/c/pas) [题目描述] 4X概念体系,是指在PC战略游戏中一种相当普及和成熟的系统概念,得名自4个同样以“EX”为开头的英语单词. eXpl ...

  3. 模拟赛 Problem 2 不等数列(num.cpp/c/pas)

    Problem 2 不等数列(num.cpp/c/pas) [题目描述] 将1到n任意排列,然后在排列的每两个数之间根据他们的大小关系插入“>”和“<”.问在所有排列中,有多少个排列恰好有 ...

  4. 省选模拟赛 Problem 3. count (矩阵快速幂优化DP)

    Discription DarrellDarrellDarrell 在思考一道计算题. 给你一个尺寸为 1×N1 × N1×N 的长条,你可以在上面切很多刀,要求竖直地切并且且完后每块的长度都是整数. ...

  5. NOIP模拟赛 6.29

    2017-6-29 NOIP模拟赛 Problem 1 机器人(robot.cpp/c/pas) [题目描述] 早苗入手了最新的Gundam模型.最新款自然有着与以往不同的功能,那就是它能够自动行走, ...

  6. [2018冬令营模拟测试赛(二十一)]Problem A: Decalcomania

    [2018冬令营模拟测试赛(二十一)]Problem A: Decalcomania 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见&quo ...

  7. noip2019集训测试赛(二十一)Problem B: 红蓝树

    noip2019集训测试赛(二十一)Problem B: 红蓝树 Description 有一棵N个点,顶点标号为1到N的树.N−1条边中的第i条边连接顶点ai和bi.每条边在初始时被染成蓝色.高桥君 ...

  8. 模拟赛20181016 Uva 1040 状压+搜索 2005 ACM world final problem c

    题目的隐含条件将这道题指向了最小生成树: 利用类似prim的方法,枚举所有子图并判断是否包含询问点,如果包含那么可以更新答案: 边统计边更新,且由于更新一定是向更多的点状态下更新,所以一定可以统计到答 ...

  9. NOIP2018 模拟赛(二十二)雅礼NOI

    Preface 这次的题目都是NOI+的题,所以大家的分数都有点惨烈. 依靠T1大力骗分水到Rank2 所以想看正解的话看这里吧 A. 「雅礼NOI2018模拟赛(一) Day1」树 看一眼题目感觉十 ...

随机推荐

  1. Centos7下python3安装pip-9.0.1

    pip类似RedHat里面的yum,安装Python包非常方便.本节详细介绍pip的安装.以及使用方法 1.下载pip安装包 [root@localhost ~]# wget https://pypi ...

  2. 设计模式 笔记 迭代器模式 Iterator

    //---------------------------15/04/26---------------------------- //Iterator 迭代器模式----对象行为型模式 /* 1:意 ...

  3. linux之 sed 基础

    转载:https://www.cnblogs.com/chensiqiqi/p/6382080.html sed 介绍 Sed命令是操作,过滤和转换文本内容的强大工具.常用功能有增删改查(增加,删除, ...

  4. Unity3d Transform.forward和Vector3.forward的区别!

    在Unity中有两个forward,一个是Transform.forward一个是Vector3.forward. 对于Vector3来说,它只是缩写.没有其它任何含义. Vector3.forwar ...

  5. 汉码盘点机PDA无缝对接思迅思迅盘点机思迅条码数据采集器批号商品盘点的方法

    1.1.    盘点批号 如果某些商品进行了批号管理,我们不仅仅要清点什么商品总数有多少个,我们还要区分该商品的某个批号有多少个数量,因此以前批号盘点工作量是非常大的. 我们的盘点机PDA支持批号盘点 ...

  6. Shell 基础 -- 输入、输出重定向

    一.文件描述符 文件描述符是一个非负的整数,Linux 中每个运行中的程序(进程),都有一些与之关联的文件描述符,你可以使用文件描述符来访问打开的文件或设备.在标准 I/O 库中,与文件描述符对应的是 ...

  7. A1043 Is It a Binary Search Tree (25 分)

    A Binary Search Tree (BST) is recursively defined as a binary tree which has the following propertie ...

  8. PAT甲题题解-1074. Reversing Linked List (25)-求反向链表

    题意说的很清楚了,这种题的话,做的时候最好就是在纸上自己亲手模拟一下,清楚一下各个指针的情况, 这样写的时候就很清楚各个指针变量保存的是什么值. PS:一次AC哈哈,所以说自己动手在纸上画画还是很有好 ...

  9. 关于如何在Tomcat中使用JavaBean

    对于没有使用myeclipse,NetBean等IDE工具的用户,如果在编写JSP时,用到了java文件,就必须配置JAVAbean了,网上也有很多在Tomcat中配置JAVABean的例子,这里我简 ...

  10. #个人博客作业Week1----关于软件和软件工程的出现

    1.软件工程这个词如何出现的? 数学与电脑科学先锋Margaret Hamilton在开发阿波罗11号软件的期间发明的,目的是将软件与硬件还有其他工程学类做出区别,为软件以及那些发明者争取应有的正统性 ...