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. JS面向对像编程四—— prototype 对象

    http://blog.csdn.net/fanwenjieok/article/details/54575560 大部分面向对象的编程语言,都是以“类”(class)作为对象体系的语法基础.Java ...

  2. Unity 向量点乘、叉乘

    向量点乘计算角度,向量叉乘计算方位 a,b为向量 点乘计算公式:a x b = |a| x |b| x cosθ 叉乘计算公式:a x b = |a| x |b| x sinθ

  3. C++的头文件(转)

    这几天在写比较困难的一部分,所以也没有时间总结一些东西了,不过昨天翻我的笔记本,发现了一篇还不错的笔记,给大家看看. C/C++头文件一览 C.传统 C++ #include <assert.h ...

  4. es6——map-set与对象对比

    {    //map,set,object对比    let item={t:1};    let map=new Map();    let set=new Set();    let obj={} ...

  5. NuSOAP笔记:如何创建复杂数据类型

    PHP已经有了内置的SOAP扩展,但是它不具备自动生成WSDL的能力,所以很多时候,NuSOAP还是有一定诱惑力的. 在应用稍微复杂点的时候,单靠integer, string等简单数据类型是不能满足 ...

  6. markdown图片设置

    工具:typora 1. 设置图片大小(本节引用自 https://support.typora.io/Resize-Image/) Typora允许使用<img>标签显示图像,也可用于调 ...

  7. java SSM多操作注解回滚

    在业务操作时难免会遇到一个业务多操作,会用到事物回滚这里写了一个简单的多操作失败事物回滚案例 在这之前你需要在你的applicationContext-mybatis.xml中配置: <!-- ...

  8. Spring MVC学习总结(7)——Spring MVC整合Ehcache缓存框架

    Ehcache算是当前比较流行的缓存框架,使用缓存可以极大的缓解服务器和数据库的压力,提高访问效率,提高服务器的并发能力.接下来我们看怎么把缓存使用起来. SpringMVC集成Ehcache所需的j ...

  9. Mysql学习总结(33)——阿里云centos配置MySQL主从复制

    1.安装jdk1.8 首先确定没有安装过jdk 2.yum –y list java*查询系统自带的jdk安装包情况. 3.安装jdk1.8 4. 验证安装结果. 安装mysql 1. rpm -Uv ...

  10. WinServer-IIS初始安装及发布网站

    \aspnet_regiis.exe –i 还有非常重要的一步就是给发布文件夹设置权限,到底设置那一个用户的权限我也没有弄清楚,大概是IIS_IUSERS或者IUSR用户就可以了,我设置完了之后没有反 ...