数论 + 计数

Problem - D - Codeforces

题意

给定整数 \(n\;(1<=n<=3e5),\;m\;(1<=m<=1e12)\)

要求求长度为 \(n\) 的数组, 满足下列条件的个数

  1. \(1<=a[i]<=m\)
  2. 对于每个位置 \(i\), 当 \(\gcd(a[i],i)=1\) 时可删去这个元素,直到删完所有元素;这个删除的过程是唯一的(即每次删除都有且只有一个位置可以删)(某个元素被删除后,他后面的元素会补上来,下标都 - 1)

思路

  1. 因为 \(\gcd(a[1],1)=1\) 恒成立,所有每次删除都可以删第一个元素,要删除的过程是唯一的,则需要每次删除时只有第一个位置可以被删
  2. 对于第 \(i\) 个位置,因为每次都会删第一个元素,所以 \(y=a[i]\) 这个值会依次出现在 \(i,i-1,i-2...2,1\) 这些位置上,并且只有在 位置1 可以被删除,所以 \(a[i]\) 要与 \(1,2,3...,i\) 均不互质,即是 \([1,i]\) 中的所有质数的倍数
  3. 维护 \([1,i]\) 的质数积 \(tmp\) 即可,第 \(i\) 个位置可以取的数就是 \(\lfloor \frac m{tmp}\rfloor\); 注意 \(tmp>m\) 时就没必要再更新了,防止溢出
  4. 注意 \(m<=1e12\), 在计算答案时 \(m\) 需要先取模再计算!!!

代码

#include <bits/stdc++.h>
using namespace std;
#define endl "\n" typedef long long ll;
typedef pair<int, int> PII;
const int N = 3e5 + 10;
const int mod = 998244353;
ll n, m;
int pr[N / 5], p[N], cnt;
ll f[N], s[N];
void get_primes(int n)
{
p[1] = 1;
for (int i = 2; i <= n; i++)
{
if (!p[i])
{
p[i] = i;
pr[++cnt] = i;
}
for (int j = 1; j <= cnt && pr[j] <= n / i; j++)
{
p[i * pr[j]] = pr[j];
if (p[i] == pr[j])
break;
}
}
} ll qmi(ll a, ll b)
{
ll ans = 1;
while(b)
{
if (b & 1)
ans = ans * a % mod;
b >>= 1;
a = a * a % mod;
}
return ans;
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
get_primes(N - 10);
cin >> n >> m;
ll sub = 0;
ll tmp = 1;
s[0] = 1;
for (int i = 1; i <= n; i++)
{
if (p[i] == i && tmp <= m)
tmp *= i;
f[i] = m / tmp % mod;
s[i] = s[i-1] * f[i] % mod;
sub = (sub + s[i]) % mod;
}
ll ans = 0;
for (int i = 1; i <= n; i++)
ans = (ans + qmi(m % mod, i)) % mod;
ans = (ans - sub + mod) % mod;
cout << ans << endl;
return 0;
}

最新文章

  1. 智力火柴游戏Android源码项目
  2. Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明
  3. javascript 对象初探(二)--- 返回对象的函数
  4. UILabel UISwitch UISegmentedControl UIAlertView
  5. JQuery插件让图片旋转任意角度且代码极其简单
  6. clientHeight,offsetHeight与scrollHeight的相关知识
  7. FileZilla 425 Can&#39;t open data connection
  8. mac svn .a文件的上传方法
  9. C++编程规范之19:总是初始化变量
  10. 如何进行系统配置 ——了解DOS下的内存
  11. qt deleterLater
  12. Edusoho之LNMP环境搭建
  13. SQL Server 中,如何獲得上個月的第一天和最後一天( 帶時間戳)
  14. 让.net core 支持静态文件
  15. FFmpeg:视频转码、剪切、合并、播放速调整
  16. [转]PostgreSQL Replication之扩展与BDR
  17. Visual Studio for Mac离线安装教程
  18. 【CF908E】New Year and Entity Enumeration 位运算+DP
  19. 【BestCoder】【Round#44】
  20. php -- 静态变量

热门文章

  1. easygui 之integerbox()、enterbox()、multenterbox() 三种输入函数的使用
  2. Maui Blazor 使用摄像头实现
  3. 《Effective C++》关于const,define等总结
  4. 字符输入流读取字符数据-writer类
  5. Java 进阶P-3.1+P-3.2
  6. 获取对象的方式-Calendar类的常用成员方法
  7. SQLSERVER 的四个事务隔离级别到底怎么理解?
  8. bash原样输出字符串中的换行
  9. 分布式事务 | 使用DTM 的Saga 模式
  10. 面向对象程序设计(二):C++模板初探