太困了,没打满
昨晚的C1睡觉的时候胡了一个贪心,就是预处理出每个洞穴进去时至少需要的力量,然后排序,不知道对不对
D1写了一个树状数组维护,但算数的过程中不知道哪里有问题,Wa on pretest 3
求各位Dbug
#include<bits/stdc++.h>
using namespace std ;
int tree[20000007] , n , m , ch , x , y , Mod ;
int lowbit(int x)
{
return x & (- x) ;
}
int sum(int x)
{
int ans = 0 ;
while(x)
{
ans += tree[x] % Mod ;
x -= lowbit(x) ;
}
return ans ;
}
void add(int x , int num)
{
while(x <= n)
{
tree[x] += num % Mod ;
x += lowbit(x) ;
}
}
int query(int x , int y)
{
//if(x > y) swap(x , y) ;
return sum(y) % Mod - sum(x - 1) % Mod ;
}
int main()
{
cin >> n >> Mod ;
add(n , 1) ;
//cout << query(n , n) ;
for(int i = n - 1 ; i >= 1 ; i --)
{
// dp[i] = dp[i + 1 ~ n] + dp[1]
// 3 -> 1 2->1 1 -> 2 +
m = 0 ;
m = query(i + 1 , n) % Mod ;
//cout << m << " " ;
int j ;
for(j = 2 ; j * i <= n ; j ++) m += query(min(n , j * i) , min(n , j * i + j - 1)) % Mod ;
//if(j * i <= n) m += query(j * i , min(n , j * i + j - 1)) ;
//cout << m << endl ;
add(i , m % Mod) ;
}
cout << (sum(1) + Mod) % Mod ;
return 0 ;
}