[cogs 2190]花样游戏
2016-07-17 07:28
204 查看
FWT
#define MAXN 200010 #include <cstdio> using namespace std; typedef long long ll; const int md = 1e9 + 7, inv2 = 500000004; int power_mod(int a, int b = md - 2) { int ret = 1; while(b > 0) { if(b & 1) ret = (ll)ret * a % md; b >>= 1; a = (ll)a * a % md; }return ret; } void fwt(int* A, int n) { for(int k = 1 ; k <= n ; k <<= 1) { int t = k>>1; for(int i = 0 ; i <= n ; i += k) { for(int j = 0 ; j < t ; j ++) { int x = A[i+j], y = A[i+j+t]; A[i+j] = (x + y) % md; A[i+j+t] = (x - y) % md; } } } } void ifwt(int* A, int n) { for(int k = 1 ; k <= n ; k <<= 1) { int t = k>>1; for(int i = 0 ; i <= n ; i += k) { for(int j = 0 ; j < t ; j ++) { int x = A[i+j], y = A[i+j+t]; A[i+j] = (ll)(x + y) * inv2 % md; A[i+j+t] = (ll)(x - y) * inv2 % md; } } } } int f[MAXN], p[MAXN], primes, n, m; bool vis[MAXN]; int main() { freopen("srmnim.in", "r", stdin); freopen("srmnim.out", "w", stdout); n = 60000; for(int i = 2 ; i <= n ; ++ i) { if(!vis[i]) p[++ primes] = i; for(int j = 1 ; j <= primes ; ++ j) { if(1ll * i * p[j] > n)break; vis[i * p[j]] = true; if(i % p[j] == 0)break; } } while(~ scanf("%d%d", &n, &m)) { int N = 1; for( ; N <= m ; N <<= 1); for(int i = 0 ; i < N ; ++ i)f[i] = 0; for(int i = 1 ; p[i] <= m ; ++ i) f[p[i]] = 1; fwt(f, N); for(int i = 0 ; i < N ; ++ i) f[i] = power_mod(f[i], n); ifwt(f, N); printf("%d\n", (f[0]+md)%md); } return 0; }
相关文章推荐
- TELNET “no router to host”错误问题解决
- 用树莓派计算模块搭建的工业单板计算机
- Linux 下8种优秀的屏幕录制机
- ubuntu14.04安装http代理squid并设置用户名和密码
- 【NOIP2016提高组A组7.16】第三条跑道
- POJ 2977 Box walking
- Ubuntu 14.04/14.10下安装VMware Workstation 11图文教程
- opencv中的开运算,闭运算,形态学梯度,顶帽和黑帽
- open-ble.org开源蓝牙ble-1_DA14580初级入门教程4:官方SDK教程
- 第44课:Spark Streaming之Spark内核回顾思考
- 目标、过程与结果
- 菜鸟之判断输入的是不是qq号的方法!
- ubuntu下安装PostgreSQL笔记
- 【编程马拉松】【027-最短编辑距离】
- 命令模式
- 哪种编程语言最值得花时间学习?
- 拉格朗日乘子法
- Java资源
- opencv中的膨胀与腐蚀
- Number of 1 Bits