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. 在Eclipse中使用Maven将项目(包括Maven引入的依赖jar文件)打成jar文件

    1.  在项目的pom.xml文件中引入以下配置: <build> <plugins> <plugin> <artifactId>maven-assem ...

  2. Eclipse中使用GIT更新项目

    GIT更新项目: 右击项目——Team——Pull:

  3. luogu P2000 拯救世界 生成函数_麦克劳林展开_python

    模板题. 将所有的多项式按等比数列求和公式将生成函数压缩,相乘后麦克劳林展开即可. Code: n=int(input()) print((n+1)*(n+2)*(n+3)*(n+4)//24)

  4. 百度api使用说明

    .初始化地图,并设置地图中心点 复制代码 https://www.cnblogs.com/zqzjs/p/5293698.html var map = new BMap.Map("allma ...

  5. BZOJ 3262 陌上花开 (三维偏序CDQ+树状数组)

    题目大意: 题面传送门 三维偏序裸题 首先,把三元组关于$a_{i}$排序 然后开始$CDQ$分治,回溯后按$b_{i}$排序 现在要处理左侧对右侧的影响了,显然现在左侧三元组的$a_{i}$都小于等 ...

  6. http://my.oschina.net/joanfen/blog/160156

    http://my.oschina.net/joanfen/blog/160156 http://code4app.com/ios/iOS7-Sampler/5254b2186803faba0d000 ...

  7. (七)u-boot2013.01.01 for s5pv210:《u-boot启动流程》

    转载请注明地址:http://blog.csdn.net/zsy2020314/article/details/9824035 1.关于启动流程 1.1 启动阶段分为3个,bl0,bl1,bl2.下面 ...

  8. SpringMVC请求@RequestParam中文乱码解决

    private String encodeStr(String str) { try { return new String(str.getBytes("ISO-8859-1"), ...

  9. 2、Koa2 路由+cookie

    一.koa2 原生路由的实现 const Koa = require('koa'); const app = new Koa(); const fs = require('fs'); function ...

  10. MVC设计模式与JavaWEB三层架构

    一.MVC设计模式 MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controlle ...