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 ;
}

最新文章

  1. source tree 推送错误解决
  2. 无法解析的外部符号 __imp__InitCommonControlsEx@4
  3. [uboot]E9-i.MX6Q-uboot移植
  4. NYOJ-58 最小步数 AC 分类: NYOJ 2014-01-22 22:01 217人阅读 评论(0) 收藏
  5. MYSQL- 创建和删除临时表
  6. ORM之三:DbProvider与DbFactory
  7. UILabel,文字添加下划线,中划线
  8. Selenium+Java+TestNG环境配置
  9. cocos2dx--cocos2dx3.1.1执行报无法解析的外部符号
  10. cloneNode小结
  11. app -webkit-box-orient: vertical 打包后不显示
  12. 常用类(Date,Calendar,Math,枚举)
  13. Ceph的BlueStore总体介绍
  14. apply、map、applymap、Dropna
  15. Java基础十--接口
  16. TP5 助手函数与TP3.2单字母函数
  17. Java项目中读取properties文件,以及六种获取路径的方法
  18. R简易安装
  19. JavaScript和jquery中的宽度
  20. STL笔记(に)--vector容器

热门文章

  1. 鼠标悬浮触发事件(onmouseover)实现
  2. 记录——本地minikube安装ubuntu镜像总是报 Back-off restarting failed container问题 -已解决(更新)
  3. hdu 5691 Sitting in line 状压动归
  4. 《Exception》第八次团队作业:Alpha冲刺(大结局)
  5. 基础——(4)D Latch(D锁存器)
  6. [HDU1160]FatMouse&#39;s Speed
  7. 2019-03-18 OpenCV Tesseract-OCR 下载 安装 配置(cv2 报错)
  8. Django -查询数据库相关操作
  9. POJ 3071
  10. HDU 4307 Contest 1