5069. 蛋糕
来源:互联网 发布:罗马圈窗帘打孔的算法 编辑:程序博客网 时间:2024/04/27 20:29
题目大意
求在
Data Constraint
题解
题目要求的就是
然后就可以考虑用杜教筛来计算。
1.计算
对于
那么
先枚举约数,转化一下
然后套路一波
2.计算
因为
3.计算
最后化出来
SRC
#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>#include<cmath>using namespace std ;#define N 10000000 + 10#define M 40000 + 10typedef long long ll ;const int MAXN = 5e6 ;ll Q[3][M] ;bool flag[N] ;int Pri[N] , phi[N] ;ll Sum[3][N] ;int n , MO , Block ;void Pre() { phi[1] = 1 ; for (int i = 2 ; i <= MAXN ; i ++ ) { if ( !flag[i] ) { Pri[++Pri[0]] = i ; phi[i] = i - 1 ; } for (int j = 1 ; j <= Pri[0] ; j ++ ) { if ( 1ll * i * Pri[j] > MAXN ) break ; flag[i*Pri[j]] = 1 ; if ( i % Pri[j] == 0 ) { phi[i*Pri[j]] = phi[i] * Pri[j] ; break ; } phi[i*Pri[j]] = phi[i] * (Pri[j] - 1) ; } } for (int i = 1 ; i <= MAXN ; i ++ ) { Sum[0][i] = (Sum[0][i-1] + phi[i]) % MO ; Sum[1][i] = (Sum[1][i-1] + (ll)i * phi[i] % MO) % MO ; Sum[2][i] = (Sum[2][i-1] + (ll)i * i % MO * phi[i] % MO) % MO ; }}ll Calc( int k , ll n ) { if ( k == -1 ) return n % MO ; ll ret ; if ( k != 1 ) ret = (n * (n + 1) / 2) % MO ; else { ll ret1 = n , ret2 = n + 1 , ret3 = 2 * n + 1 ; if ( ret1 % 2 == 0 ) ret1 /= 2 ; else if ( ret2 % 2 == 0 ) ret2 /= 2 ; else if ( ret3 % 2 == 0 ) ret3 /= 2 ; if ( ret1 % 3 == 0 ) ret1 /= 3 ; else if ( ret2 % 3 == 0 ) ret2 /= 3 ; else if ( ret3 % 3 == 0 ) ret3 /= 3 ; ret1 = ret1 * ret2 >= MO ? ret1 * ret2 % MO : ret1 * ret2 ; ret1 = ret1 * ret3 >= MO ? ret1 * ret3 % MO : ret1 * ret3 ; return ret1 ; } if ( k == 2 ) ret = ret * ret >= MO ? ret * ret % MO : ret * ret ; return ret ;}ll S( int x , int k ) { if ( x <= MAXN ) return Sum[k][x] ; int t = x <= Block ? x : n / x + Block ; if ( Q[k][t] ) return Q[k][t] ; ll ret = Calc( k , x ) ; for (int i = 2 ; i <= x ; i ++ ) { int r = x / (x / i) ; ret = (ret - (Calc( k - 1 , r ) - Calc( k - 1 , i - 1 )) % MO * S(x/i,k) % MO) % MO ; i = r ; } Q[k][t] = ret ; return ret ;}int main() { freopen( "cake.in" , "r" , stdin ) ; freopen( "cake.out" , "w" , stdout ) ; scanf( "%d%d" , &n , &MO ) ; Block = sqrt(n) ; Pre() ; ll ans = (ll)n * n % MO * 2ll % MO * S(n,0) % MO ; ans = (ans - 3ll * n % MO * S(n,1) % MO) % MO ; ans = (ans + S(n,2)) % MO ; ans = 2ll * ans % MO ; printf( "%lld\n" , (ans + MO) % MO ) ; return 0 ;}
以上.
1 0
- 5069. 蛋糕
- 蛋糕
- 蛋糕
- 蛋糕
- 2043 蛋糕
- 切蛋糕
- 酸奶蛋糕
- 分蛋糕
- 切蛋糕
- 分蛋糕
- 三角蛋糕
- 三角蛋糕
- 平分蛋糕
- 分蛋糕
- 分蛋糕
- 分蛋糕
- 孝感蛋糕
- 分蛋糕
- 数据查询
- 23种设计模式模式详解 Java 行为型模式(三)
- ubuntu16.04配置shadowshocks和chrome
- Chinese Girls' Amusement (大数除法,大数减法)
- 2.Unity3D商业游戏源码研究-变身吧主公-SceneMgr
- 5069. 蛋糕
- NET 获取类内成员的名称,以字符串形式显示
- 一个按时提醒休息的简单C语言程序
- random 猜大小
- 条件编译,预处理
- mysql 入门
- LeetCode#148. Sort List
- Lab 2
- unit2~~~控制对文件的访问