JZOJ5787轨道

Description

2018年1月31日,152年一遇的超级大月全食在中国高空出现(没看到的朋友真是可惜),小B看到月食,便对月球的轨道产生了兴趣。他上网查重力加速度的公式,公式如下:

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFkAAAA/CAYAAACLpmToAAADUElEQVR4nO2aAZKjIBBFO1t7GvA4g3sc5TgLOY54HZYGTQzqTGJiCyuvytSMASv1aZvmw8U6oLArv47+AWegiExAEZmAIjIBRWQCisgEFJEJKCITUEQmoIhMQFYi6/oCl8vkqrW7a0DW0n3GbWrQ6w+6PaOSZq3V57A5oAT6KxZ4a7uF+7ztFtpzG9/2dK3l+CwQVu34k6ekL/IgpFhRpGv57DslYEXkzraCe5FnA7MjaacLI6HClCAUOOFWYMDZ9H8NPW9BuARi+vhxErAxJgjG+C4/eRGy4dxAiMgXX2sX+UIpK+Lod2lCuOjFyKdMFUjCkWygx0jkHFh0X1bRBDiZ5DQGvmDYzfU39z4uiJsG4KoNNoDVF2MPCAf0RUI0wloyXpz0XJ+hvX8Lhr+7VoT8PEx6a4/ci4Qj+XuMD3PhonOSW0MYRw0lSGgAm5mrdjEtZk12h3ZMX+PbKoHPo1yJe671uZe7/CzuZd80uilJWuRbyognqsXX3rWd1tFxrTz0oSzdRhIXORAiOromgoaKYfxuGJChmljsTxzNF/wgzlCnI9uJLyeKyARsF/nmZFUwNbK8C1av+l+nZLvIQrlJU3mPQF/N5LaaraZmFmV8/eeD8vu97qGwr70TMywKdDB0HlopC2eeXd8UGYChSaB772xxdM20gE792O1HMMIp2bPIenvi42y0bzTUfwD+LniSW9KFDTU82bUrb1fa464FsX34HOOK8ZiV3shnSjjeQmfnE97RGNm7obd+gmatXN/z25nTrPh0XUHfdNAQboiMnGcxwgV8HSAwcg6R3cJJswYO0vj9Ei55cGXqykr7gbJyM4dNuQQ8WqD0204jp5n4juQcOflgisgEFJEJyF5kIyvvf9zsj8HnJjmt+STZlnBoOt19JR7Ow6HACXrT2Uay96hHvwRXcxBsVutdQA7iqOXdAtlGssf04LcLBIOr7Aeb1QmdWFGabSQj4dgVB2a0P02YTuw+krHIJpzQRGV5c4i79iz5pgtzBe0LCAaiS1hhyDiSQ6pY3h1PjWxF7o2XmP4Y7AYyFVn7kwfkJ+Y3kqfITuGgcQ4Sn2iP70jyjOTMKCITUEQmoIhMQBGZgCIyAUVkAorIBBSRCSgiE/APv6fMR0YR1y0AAAAASUVORK5CYII=" alt=" " />
就在这个时候,他想到了一个跟这个差不多的问题,那就是对于以下公式:
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAALMAAABECAYAAADKgwRSAAAD5klEQVR4nO2dAXKrIBCG1zc9jXic4DtO8DgPchzxOjwgmqZprDWBKJv/m+l0EtOuhC+wi9hWzkMAMODP1icAQCogM2ADZAZsgMyADZAZsAEyAzZAZsAGyAzYAJkBGyAzYANkBmyAzIANkBmwATIDNry1zKatqGpN8TG3aMceeUOZLXXNufNrIUiI+ixD0/kjJcXcoh07x70l2knfdLp8Sf9MiTG3aMd+ecORGbBl60/T6+mdEn4Uk9r1SjiheqelfyyUP1JSzC3asW/Kl1nLm2l27GQSTi30aux8uWJifiLWwzFz/M4E7dgjBct8rwO0U1I6QalHqFfGygmXdtynUJmnwud7wRNHKX9MJBtiXhkrJ1zaMU+RBaBpWwqrqlJrkndfIUgeRHGxcsKlHT+y9adpNVO+dzdHHKfRVNPlK2PlhEs7FihM5oVCpVcx9ztPl9NrH117XRMr8Lnmu366vhVq6XHOdpRLWTKPb/xcp0653+cAFDryQZlXxuqVGuMEqXd08WL1e1YuRckc1lNnR77LctO1SI/LvD7W9eH9LHGtbkeUPzw+zzQljdhFFoDfsB013UCxfJFypsB5YSwhafe11Gw7DiR9XjK0JihNtR02O8W1FCWzqOv43aqOpj1itmuo+kt0lBQ32EjfMaZtqHtyt83DsUxLpj7SXlxe3Q7h5TWGrNQk/fdB1Fud+nq2nhrWMk2bdFNsXT+fJGdeHcudp+0dJp+r2uHbMB3Xcke5/y9IJ/Ml//qaL+a4fPv7Uxo78AXLTrfC7NDpX/Ep8Lg6U9CSXeKR+V7R4J+76dmLZHNfpZoANuUjbdIiQy1BbSwaxqzR511ezq+v0o7wF85BahLLTPGuBzJDLCxEqJiNpF4v/tgiVVU9/0vAw7gC/sFCcpmn6tkbTa2vmP/13xevwu09P96y5kfykItcU8KbCbalcqktMe14c6Uk7eY2tQCQnjzrzEJRD5HBi0k/MgOwEUVdAQTgJyBzVnwRXFVxJaZ59vo6WAQyZ2UqghncxVEAkDk3dqChhF10DIDMmbEnQ7aud7OLjjOQOSuWTsbGLZZx//CYPyOHzkPyK4DgCnsiY2XcN0xUUy019Rqr77nAOnNGwib4xh7JHQdqGktHXEjKCkbmjAzWni/vx30o0Dg3yJmzYcgYQap35HrlC8DBy731OfEGMufCeJmnJTlxICksmVOw2VLX4a/c5wAyZ8J4mYU8jEtygg5SkFUNVeFO0gNSjhygAARswMgM2ACZARsgM2ADZAZsgMyADZAZsAEyAzZAZsAGyAzYAJkBGyAzYANkBmyAzIANkBmwATIDNkBmwIb/tzM3QIEAYCwAAAAASUVORK5CYII=" alt=" " />
已知n和k,求这n个正整数在都不大于m的情况下有多少种选择方式,使得v为与k互质正整数?
 

Input

一行三个正整数n,m,k(意义见题目描述)。

Output

输出一个答案,代表方案数。因为答案可能会很大,所以输出方案数mod 10007的值。

Data Constraint

数据范围
对于20%的数据 1<=n,m<=8 k<=100
对于40%的数据 1<=n<=50 1<=m<=10^6 1<=k<=10^4
对于70%的数据 1<=n<=100 1<=m<=10^9 1<=k<=10^7
对于100%的数据 1<=n<=3000 1<=m<=10^9 1<=k<=10^7

题解

模拟赛的题,然后我就GG了
设dp[i][j]为前i个数的乘积与k的gcd是k的第j个约数(且乘积除以公约数与k互质)的方案数。
然后转移方程是dp[i][j]=sigema dp[i-1][k]*dp[1][第j个约数/第k个约数是第几个约数]这里的k是一个枚举的变量。第j个约数可以整除第k个约数。
然后考虑初始化dp[1][...];
dp[1][j]代表的是和1~m中与k的gcd为k的第j个约数的数的数量。
但是枚举绝对会T。
我们其实要求的是gcd(x,k)=第j个约数(1<=x<=m)的方案数。
把公式化一下化为gcd(x.k)=1(1<=x<=m/第j个约数(向下取整)(以后称为m1))的方案数。
然后使用容斥。
怎么用容斥呢,举个例子。
设k的质因数为A,B,C
方案数为m1/1- m1/A - m1/B - m1/C + m1/(A*B) + m1/(B*C) + m1/(A*C) - m1/(A*B*C)
很简单的容斥,仔细想想就能明白。具体实现还是看代码吧。
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<vector>
#define MOD 10007
using namespace std;
int n,m,k,fac[],kpri[],fsf[][],mp[];
int m1,sum;
int dp[][];
void dfs(int cnt,int p_m,int assemble)
{
if(cnt>kpri[]) {sum+=m1/assemble*p_m;return;}
dfs(cnt+,p_m,assemble);
dfs(cnt+,-p_m,assemble*kpri[cnt]);
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
int sqtk=sqrt(k);
for(int i=;i<=sqtk;i++)
if(k%i==)
{
fac[++fac[]]=i;
if(k/i>sqtk) fac[++fac[]]=k/i;
}
sort(fac+,fac++fac[]);
int tmp=k;
for(int i=;i<=sqtk;i++)
{
if(tmp==) break;
if(tmp%i==)
{
kpri[++kpri[]]=i;
while(tmp%i==) tmp/=i;
}
}
if(tmp!=) kpri[++kpri[]]=tmp;
sort(kpri+,kpri++kpri[]);
for(int i=;i<=fac[];i++)
{
mp[fac[i]]=i;
sum=,m1=m/fac[i];
dfs(,,);
dp[][i]=sum%MOD;
}
for(int i=;i<=fac[];i++){
cout<<dp[][i]<<" ";
}
cout<<endl;
for(int i=;i<=fac[];i++)
for(int j=;j<=i;j++)
if(fac[i]%fac[j]==) fsf[i][++fsf[i][]]=j;
for(int i=;i<=n;i++)
for(int j=;j<=fac[];j++)
{
if(fsf[j][]==) continue;
for(int k=;k<=fsf[j][];k++)
(dp[i][j]+=dp[i-][fsf[j][k]]*dp[][mp[fac[j]/fac[fsf[j][k]]]])%=MOD;
}
printf("%d\n",dp[n][fac[]]);
return ;
}

JZOJ5787轨道(容斥+DP)的更多相关文章

  1. HDU 5794 A Simple Chess (容斥+DP+Lucas)

    A Simple Chess 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5794 Description There is a n×m board ...

  2. [CF1086E]Beautiful Matrix(容斥+DP+树状数组)

    给一个n*n的矩阵,保证:(1)每行都是一个排列 (2)每行每个位置和上一行对应位置不同.求这个矩阵在所有合法矩阵中字典序排第几.考虑类似数位DP的做法,枚举第几行开始不卡限制,那么显然之前的行都和题 ...

  3. 【BZOJ3622】已经没有什么好害怕的了 容斥+DP

    [BZOJ3622]已经没有什么好害怕的了 Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30 Sample Output ...

  4. $bzoj2560$ 串珠子 容斥+$dp$

    正解:容斥+$dp$ 解题报告: 传送门$QwQ$ $umm$虽然题目蛮简练的了但还是有点难理解,,,我再抽象一点儿,就说有$n$个点,点$i$和点$j$之间有$a_{i,j}$条无向边可以连,问有多 ...

  5. 【XSY3156】简单计数II 容斥 DP

    题目大意 定义一个序列的权值为:把所有相邻的相同的数合并为一个集合后,所有集合的大小的乘积. 特别的,第一个数和最后一个数是相邻的. 现在你有 \(n\) 种数,第 \(i\) 种有 \(c_i\) ...

  6. bzoj3782上学路线(Lucas+CRT+容斥DP+组合计数)

    传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=3782 有部分分的传送门:https://www.luogu.org/problemnew/ ...

  7. AGC 005D.~K Perm Counting(容斥 DP 二分图)

    题目链接 \(Description\) 给定\(n,k\),求 满足对于所有\(i\),\(|a_i-i|\neq k\)的排列的个数. \(2\leq n\leq 2000,\quad 1\leq ...

  8. ARC 101E.Ribbons on Tree(容斥 DP 树形背包)

    题目链接 \(Description\) 给定一棵\(n\)个点的树.将这\(n\)个点两两配对,并对每一对点的最短路径染色.求有多少种配对方案使得所有边都至少被染色一次. \(n\leq5000\) ...

  9. 【做题】51NOD1518 稳定多米诺覆盖——容斥&dp

    题意:求有多少种方案,用多米诺骨牌覆盖一个\(n\times m\)的棋盘,满足任意一对相邻行和列都至少有一个骨牌横跨.对\(10^9+7\)取模. \(n,m \leq 16\) 首先,这个问题的约 ...

随机推荐

  1. BZOJ 4006 [JLOI2015]管道连接(斯坦纳树+子集DP)

    明显是一道斯坦纳树的题. 然而这题只需要属性相同的点互相连接. 我们还是照常先套路求出\(ans[s]\). 然后对\(ans[s]\)做子集DP即可. 具体看代码. #include<iost ...

  2. Windows 10快速在指定目录打开命令行

    一.我们在想要到达的目录上按住shift键并点击鼠标右键.看到了吗,这时候在弹出菜单里多了一个选项,就是"在此处打开命令窗口",我们点开看一下. 二.不过有时候我们需要以管理员的权 ...

  3. .conf、.bak是什么格式

    1..conf 是config的简写,也就是配置文件,多用于存取硬件驱动程序的安装配置信息.内容一般是一些硬件的版本号呀,支持什么样的系统等信息.本质上来说就是TXT文件,里面的格式没有统一标准,各个 ...

  4. Java String.replaceAll()方法

    声明  以下是java.lang.String.replaceAll()方法的声明 public String replaceAll(String regex, String replacement) ...

  5. 多本Web前端深度修炼书籍(提供网盘下载链接)

    书籍介绍:这本书涵盖了html5新增标签和功能,而且提供了jquerymobile,Phonegap,Sencha Touch框架的介绍和应用,最后还带了一个移动web应用的样例,绝对是移动web开发 ...

  6. Linux内核中进程上下文和中断上下文的理解

    參考: http://www.embedu.org/Column/Column240.htm http://www.cnblogs.com/Anker/p/3269106.html 首先明白一个概念: ...

  7. 面向程序猿的设计模式 ——GoF《设计模式》读书总结(壹)抽象工厂&amp;生成器

    第一部分:创建型模式 创建型模式抽象了实例化过程. 它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.(把一些小的对象组装成大对象,这个工作由专门的类对象来做) 一个类创建型模式使用继承改变被实 ...

  8. hdu2838Cow Sorting(树状数组+逆序数)

    题目链接:点击打开链接 题意描写叙述:给定一个长度为100000的数组,每一个元素范围在1~100000,且互不同样,交换当中的随意两个数须要花费的代价为两个数之和. 问怎样交换使数组有序.花费的代价 ...

  9. UVA 1016 - Silly Sort 置换分解 贪心

                                           Silly Sort Your younger brother has an assignment and needs s ...

  10. node15---cookie session

    二.Cookie和Session 2.1 Cookie ● HTTP是无状态协议.简单地说,当你浏览了一个页面,然后转到同一个网站的另一个页面,服务器无法认识到,这是同一个浏览器在访问同一个网站.每一 ...