pid=3970">链接

题解:www.cygmasot.com/index.php/2015/08/17/hdu_3970

给定n

 求连续整数[0,n), 中随意选一些数使得选出的数和为n的倍数的方法数

。。。并不会怎样递推。

思路:

然后这是公式:

q=2%2C2%2C4%2C4%2C8%2C12%2C20%2C32%2C60&language=english&go=Search">点击打开链接

a(n) = 1/n * sum_{d divides n and d is odd} 2^(n/d) * phi(d).

d最大是n,也就是1e9,要计算1e9的phi,所以容斥来算phi.

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <vector>
#include <string>
#include <time.h>
#include <math.h>
#include <iomanip>
#include <queue>
#include <stack>
#include <set>
#include <map>
const int inf = 1e9;
const double eps = 1e-8;
const double pi = acos(-1.0);
template <class T>
inline bool rd(T &ret) {
char c; int sgn;
if (c = getchar(), c == EOF) return 0;
while (c != '-' && (c<'0' || c>'9')) c = getchar();
sgn = (c == '-') ? -1 : 1;
ret = (c == '-') ? 0 : (c - '0');
while (c = getchar(), c >= '0'&&c <= '9') ret = ret * 10 + (c - '0');
ret *= sgn;
return 1;
}
template <class T>
inline void pt(T x) {
if (x < 0) { putchar('-'); x = -x; }
if (x > 9) pt(x / 10);
putchar(x % 10 + '0');
}
using namespace std;
const int N = 1e5 + 10;
const int mod = 1e9 + 7;
typedef long long ll;
typedef pair<int, int> pii;
int Pow(int x, int y){//高速幂
int ans = 1;
while (y){
if (y & 1)ans = (ll)ans*x%mod;
y >>= 1;
x = (ll)x*x%mod;
}
return ans;
}
int prime[N], primenum;//素数表
void PRIME(int Max_Prime){
primenum = 0;
prime[primenum++] = 2;
for (int i = 3; i <= Max_Prime; i += 2)
for (int j = 0; j<primenum; j++)
if (i%prime[j] == 0)break;
else if (prime[j]>sqrt((double)i) || j == primenum - 1)
{
prime[primenum++] = i;
break;
}
}
void add(int &x, int y){ x += y; if (x >= mod)x -= mod; }//加法
void go(int x, vector<int>&Pri, vector<int>&Num){//分解质因数
Pri.clear(); Num.clear();
while (!(x & 1))x >>= 1;
for (int i = 1; (ll)prime[i] * prime[i] <= x; i++){
if (x%prime[i])continue;
Pri.push_back(prime[i]);
Num.push_back(0);
while (x%prime[i] == 0)x /= prime[i], Num[Num.size() - 1]++;
}
if (x != 1 && (x&1))Pri.push_back(x), Num.push_back(1);
}
vector<int>_pri, _num;
void cal(int id, int mul, int siz, int sor, int &now){//容斥算欧拉函数
if (id == _pri.size()){
if (mul == 1)return;
if (siz & 1)now += sor / mul;
else now -= sor / mul;
return;
}
cal(id + 1, mul, siz, sor, now);
cal(id + 1, mul*_pri[id], siz + 1, sor, now);
}
int phi(int x){
if (x == 1)return 1;
go(x, _pri, _num);
int now = 0;
cal(0, 1, 0, x, now);
return x - now;
}
int ans, n;
vector<int>pri, num;
void dfs(int id, int d){
if (id == pri.size())
{
add(ans, (ll)Pow(2, n / d) * phi(d) % mod);
return;
}
for (int i = 0; i <= num[id]; i++){
dfs(id + 1, d);
d *= pri[id];
}
}
int main(){
PRIME(1e5);
int T; rd(T);
while (T--){
rd(n);
go(n, pri, num);
ans = 0;
dfs(0, 1);
pt((ll)ans*Pow(n, mod - 2) % mod); puts("");
}
return 0;
}

最新文章

  1. Linux各个目录的作用及内容
  2. 查询指定网段可用IP脚本
  3. ArrayList用法
  4. Java字节流:FilterInputStream FilterOutputStream
  5. hdu 1972.Printer Queue 解题报告
  6. SupportV7包中 SwipeRefreshLayout 修改下拉控件的距离
  7. 经典设计:30个另类的 404 not found 页面设计
  8. nohup之no hang up, kill, ps -ef, ps aux, grep
  9. Android 建立文件夹、生成文件并写入文本文件内容
  10. C# 条码标签打印程序,RDLC报表动态显示多条码标签的方法
  11. uploadify插件实现多个图片上传并预览
  12. android LinearLayout和RelativeLayout实现精确布局
  13. C++传递函数指针
  14. python3和python2的区别部分
  15. caffe︱深度学习参数调优杂记+caffe训练时的问题+dropout/batch Normalization
  16. 转://oracle 软件的收费模式
  17. Android--手势及触摸事件的注意点(一)
  18. wifidog源码分析 - 客户端检测线程
  19. MySQL_基础知识
  20. ios中GDataXML解析XML文档

热门文章

  1. python json (loads(),load(),jump(),jumps())
  2. Android 桌面Widget开发要点(时间日期Widget)
  3. Android——requestWindowFeature()的应用
  4. pppoe应用概述
  5. Java编程的逻辑 (63) - 实用序列化: JSON/XML/MessagePack
  6. IE兼容性视图设置
  7. js学习(五)-全局函数和类内部函数区别
  8. JQuery控制radio选中和不选中方法总结
  9. ajax传递参数给springmvc总结[转]
  10. Oracle 11g 数据库 shutdown 后立即执行 startup mount 报错的解决办法