Educational Codeforces Round 138 (Rated for Div. 2) - D. Counting Arrays
2024-09-08 18:08:22
数论 + 计数
题意
给定整数 \(n\;(1<=n<=3e5),\;m\;(1<=m<=1e12)\)
要求求长度为 \(n\) 的数组, 满足下列条件的个数
- \(1<=a[i]<=m\)
- 对于每个位置 \(i\), 当 \(\gcd(a[i],i)=1\) 时可删去这个元素,直到删完所有元素;这个删除的过程是唯一的(即每次删除都有且只有一个位置可以删)(某个元素被删除后,他后面的元素会补上来,下标都 - 1)
思路
- 因为 \(\gcd(a[1],1)=1\) 恒成立,所有每次删除都可以删第一个元素,要删除的过程是唯一的,则需要每次删除时只有第一个位置可以被删
- 对于第 \(i\) 个位置,因为每次都会删第一个元素,所以 \(y=a[i]\) 这个值会依次出现在 \(i,i-1,i-2...2,1\) 这些位置上,并且只有在 位置1 可以被删除,所以 \(a[i]\) 要与 \(1,2,3...,i\) 均不互质,即是 \([1,i]\) 中的所有质数的倍数
- 维护 \([1,i]\) 的质数积 \(tmp\) 即可,第 \(i\) 个位置可以取的数就是 \(\lfloor \frac m{tmp}\rfloor\); 注意 \(tmp>m\) 时就没必要再更新了,防止溢出
- 注意 \(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;
}
最新文章
- 智力火柴游戏Android源码项目
- Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明
- javascript 对象初探(二)--- 返回对象的函数
- UILabel UISwitch UISegmentedControl UIAlertView
- JQuery插件让图片旋转任意角度且代码极其简单
- clientHeight,offsetHeight与scrollHeight的相关知识
- FileZilla 425 Can&#39;t open data connection
- mac svn .a文件的上传方法
- C++编程规范之19:总是初始化变量
- 如何进行系统配置 ——了解DOS下的内存
- qt deleterLater
- Edusoho之LNMP环境搭建
- SQL Server 中,如何獲得上個月的第一天和最後一天( 帶時間戳)
- 让.net core 支持静态文件
- FFmpeg:视频转码、剪切、合并、播放速调整
- [转]PostgreSQL Replication之扩展与BDR
- Visual Studio for Mac离线安装教程
- 【CF908E】New Year and Entity Enumeration 位运算+DP
- 【BestCoder】【Round#44】
- php -- 静态变量
热门文章
- easygui 之integerbox()、enterbox()、multenterbox() 三种输入函数的使用
- Maui Blazor 使用摄像头实现
- 《Effective C++》关于const,define等总结
- 字符输入流读取字符数据-writer类
- Java 进阶P-3.1+P-3.2
- 获取对象的方式-Calendar类的常用成员方法
- SQLSERVER 的四个事务隔离级别到底怎么理解?
- bash原样输出字符串中的换行
- 分布式事务 | 使用DTM 的Saga 模式
- 面向对象程序设计(二):C++模板初探