挺有趣的恩:洛谷P2155

在纸上打打草稿,写出n!个数,从先往后,遇到不互质的就筛掉——发现一个奇妙的性质!:筛掉的次数、顺序好像是周期性出现的呢~

而且更加妙妙的是,好像还是m!一轮..那么因为n!一定能被m!整除,所以问题转变为:(n!\m! - 有多少个循环节)*(φ(m))。

接下来,φ(m) = m!*(1 - 1/p1)*(1 - 1/p2)...任务就只剩下打出阶乘表&逆元啦。离线的处理会快很多。

#include <bits/stdc++.h>
using namespace std;
#define maxn 10000050
#define ll long long
#define int long long
int maxx, now = , P, T, tot, inv[maxn], ans[], pri[maxn],fac_a[maxn], fac_b[maxn], fac_c[maxn];
bool is_prime[maxn];
struct query
{
int n, m, id, pri;
}Q[]; int read()
{
int x = ;
char c;
c = getchar();
while(c < '' || c > '') c = getchar();
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x;
} bool cmp1(query a, query b)
{
return a.m < b.m;
} int Get_Pri(int n)
{
for(int i = ; i <= n; i ++)
{
if(!is_prime[i])
{
pri[++ tot] = i;
while(now <= T && pri[tot] > Q[now].m)
{
Q[now].pri = tot - ;
now ++;
}
}
while(now <= T && i == n)
{
Q[now].pri = tot;
now ++;
}
for(int j = ; j <= tot; j ++)
{
if(i * pri[j] > n) break;
is_prime[i * pri[j]] = ;
if(!(i % pri[j])) break;
}
}
} int Get_fac(int n)
{
fac_a[] = fac_a[] = fac_b[] = fac_b[] = fac_c[] = fac_c[] = ;
inv[] = inv[] = ;
for(int i = ; i <= n; i ++)
{
fac_a[i] = (fac_a[i - ] * i) % P;
inv[i] = ((P - P / i) * inv[P % i]) % P;
}
for(int i = ; i <= tot; i ++)
{
fac_b[i] = inv[pri[i]];
fac_b[i] = (fac_b[i] * fac_b[i - ]) % P;
fac_c[i] = pri[i] - ;
fac_c[i] = (fac_c[i] * fac_c[i - ]) % P;
}
} signed main()
{
T = read(), P = read();
for(int i = ; i <= T; i ++)
{
Q[i].n = read(), Q[i].m = read(), Q[i].id = i;
maxx = max(maxx, max(Q[i].n, Q[i].m));
}
sort(Q + , Q + + T, cmp1);
Get_Pri(maxx);
Get_fac(maxx);
for(int i = ; i <= T; i ++)
ans[Q[i].id] = ((fac_a[Q[i].n] * fac_b[Q[i].pri]) % P * fac_c[Q[i].pri]) % P;
for(int i = ; i <= T; i ++)
printf("%lld\n", ans[i]);
return ;
}

【题解】SDOI2008莎拉公主的困惑的更多相关文章

  1. 【bzoj题解】2186 莎拉公主的困惑

    题目传送门. 题意:求\([1,n!]\)中与\(m!\)互质的数的个数,对质数\(R\)取模,\(n\geq m\). 答案应该等于\(\frac{n!}{m!}\phi(m!)=\frac{n!} ...

  2. [BZOJ 2186][SDOI 2008] 莎拉公主的困惑

    2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 4519  Solved: 1560[Submit][S ...

  3. 莎拉公主的困惑(bzoj 2186)

    Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁国现 ...

  4. Bzoj 2186: [Sdoi2008]沙拉公主的困惑 乘法逆元,线性筛,欧拉函数,数论

    2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 2560  Solved: 857[Submit][St ...

  5. 【bzoj2186】[Sdoi2008]沙拉公主的困惑

    2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 3303  Solved: 1129[Submit][S ...

  6. 【BZOJ2186】[Sdoi2008]沙拉公主的困惑 线性筛素数

    [BZOJ2186][Sdoi2008]沙拉公主的困惑 Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M! ...

  7. 数学(逆元):BZOJ 2186: [Sdoi2008]沙拉公主的困惑

    2186: [Sdoi2008]沙拉公主的困惑 Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞 ...

  8. 洛咕 P2155 [SDOI2008]沙拉公主的困惑

    洛咕 P2155 [SDOI2008]沙拉公主的困惑 有个结论,就是如果\(gcd(a,b)=1\),那么\(gcd(a+kb,b)=1\).证明比较显然. 所以这个题目要问的\(n!\)就可以分成\ ...

  9. BZOJ2186: [Sdoi2008]沙拉公主的困惑(求[1,N!]与M!互素的个数)(线性筛)

    2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 6103  Solved: 2060[Submit][S ...

随机推荐

  1. JavaScript--Dom操作元素的样式

    在前端开发中,有时候需要动态修改的网页元素的样式,这里将使用JS动态修改元素样式的方法做个小结: 网页结构: 按钮: 标签:input    类型:button     id:btn          ...

  2. 【c学习-14】

    /*练习*/ #include int testFeiunction(b[],n){ b[1]=1; n=10; } int main(){ int a[10]={1,2,3,4,5}; int n= ...

  3. 使用CSS3制作首页登录界面实例

    响应式设计 在这个页面中,使用下面3点来完成响应式设计 1.最大宽度 .设定了一个 max-width 的最大宽度,以便在大屏幕时兼容.: 2.margin : 30px auto; 使其保持时刻居中 ...

  4. 一道SQL面试题——表行列数据转换(表转置)

    SQL语句如下: select country, sum(case when type='A' then money end) as A, sum(case when type='B' then mo ...

  5. Nodejs 使用 SerialPort 调用串口

    工作经常使用串口读写数据,electron 想要替代原来的客户端,串口成了必须要突破的障碍. get -->  https://github.com/EmergingTechnologyAdvi ...

  6. Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000

    启动程序报错: Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000006fff80000, 28636 ...

  7. Scala语法(三)

    模式匹配 1)match val a = 1 val b=a match { *// a match { }返回值赋予变量 b case 1 => "red" case 2 ...

  8. 某CTF收集的Mysql爆表、爆字段语句

    Mysql特性 获取数据库名未知函数可爆数据库名 FUNCTION youcanneverfindme17.a does not exist 获取表名and linestring(pro_id)    ...

  9. C# 实现程序开机自启动

    最近在做一个自动备份文件的小工具,需要用到开机自启动 下面是代码 private void checkBox8_CheckedChanged(object sender, EventArgs e) { ...

  10. fopen,fwrite,fread使用

    fopen, fwrite, fread详解 1.头文件 #include <stdio.h> 2.fopen (1) 函数原型 FILE *fopen(char *filename, * ...