HDU_5528_Count a * b
Count a * b
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 872 Accepted Submission(s): 315
Let's denote f(m) as the number of ways to choose two non-negative integers a and b less than m to make a×b mod m≠0.
She has calculated a lot of f(m) for different m, and now she is interested in another function g(n)=∑m|nf(m). For example, g(6)=f(1)+f(2)+f(3)+f(6)=0+1+4+21=26. She needs you to double check the answer.
Give you n. Your task is to find g(n) modulo 264.
1≤T≤20000
1≤n≤109
6
514
328194
- 要推公式啊,贴过程:
- 注:
- (1)后半个公式可以看做对于变量a在整数意义上的划分,之后再进行gcd结果的加和。这里对于划分变量的方式有改进的余地,可以根据gcd结果进行划分。考虑gcd(x,a)|x,所以用x的因数对gcd结果进行划分,而且最好用Dirichlet的形式进行改进,毕竟gcd和常函数都是积性函数,Dirichlet形式下的新函数保持积性函数的性质,利于简化计算。
- (2)对于f(x)的化简结果,考虑带入g(n)有进一步化简的可能
- (3)考虑整除的传递性,这里如果可以把变量x消去是最好的。我们这里先枚举d,再找x,之后用i代替x/d,i*d|n,其中i*d==x,根据整除性质不难得到i|(d/n),那么就看到一个很熟悉的公式,后半公式就是对于n求全部因数的欧拉函数,结果就是n本身
- (4)最终结果
- (5)把因数k次方和理解成多项式相乘处理是有一定好处的,好处在于没有对于除法的处理,全都是简单的加法和乘法,这对于取模运算是一大福音。此外,考虑到因数k次方函数是积性函数,也可以先对n分解质因数之后分步求解,但是这里就要对于每一个质因数的乘方做等比数列求和,牵扯到除法,对应的在代码中要做防溢出操作(好吧,我这个鶸是不会这种骚操作的QAQ)
- 至于说题目里对于2^64取模就是在unsigned longlong下运算就ok
#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
using namespace std;
typedef long long LL ;
typedef unsigned long long ULL ;
const int maxn = 1e5 + ;
const int inf = 0x3f3f3f3f ;
const int npos = - ;
const int mod = 1e9 + ;
const int mxx = + ;
const double eps = 1e- ;
const double PI = acos(-1.0) ; ULL T, n, prime[maxn], nd, theta2;
bool vis[maxn];
int tot, cnt;
void init(int top){
tot=;
memset(vis,true,sizeof(vis));
for(int i=;i<=top;i++){
if(vis[i]){
prime[tot++]=(ULL)i;
}
for(int j=;j<tot&&(i*prime[j]<=top);j++){
vis[i*prime[j]]=false;
if(i%prime[j]==)
break;
}
}
}
int main(){
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
init(1e5+);
while(~scanf("%llu",&T)){
while(T--){
scanf("%llu",&n);
theta2=1ULL;
nd=n;
for(int i=;i<tot && prime[i]*prime[i]<=n;i++)
if(n%prime[i]==){
ULL p=prime[i], alpha=0ULL;
ULL sigma=1ULL, square=1ULL;
while(n%p==0ULL){
alpha++;
square*=p;
sigma+=square*square;
n/=p;
}
nd*=alpha+1ULL;
theta2*=sigma;
}
if(n>){
nd*=2ULL;
theta2*=(1ULL+n*n);
}
printf("%llu\n",theta2-nd);
}
}
return ;
}
HDU_5528_Count a * b的更多相关文章
随机推荐
- 市场风险~VaR的概述
1.概念理解 VaR的含义:Value at Risk 按字面的解释就是"处于风险状态的价值",可译为受险价值.在险价值.风险价值等. 通常解释为:VaR是在一定置信水平和一定持有 ...
- iframe之间操作记录
1.watch.js (function ($) { $.fn.watch = function (callback) { return this.each(function () { //缓存以前的 ...
- Spring Boot系列——7步集成RabbitMQ
RabbitMQ是一种我们经常使用的消息中间件,通过RabbitMQ可以帮助我们实现异步.削峰的目的. 今天这篇,我们来看看Spring Boot是如何集成RabbitMQ,发送消息和消费消息的.同时 ...
- CentOS 7下升级Python版本到3.x系列
由于python官方已宣布2.x系列即将停止支持,为了向前看,我们升级系统的python版本为3.x系列服务器系统为当前最新的CentOS 7.4 1.安装前查看当前系统下的python版本号 # p ...
- 从yield 到yield from再到python协程
yield 关键字 def fib(): a, b = 0, 1 while 1: yield b a, b = b, a+b yield 是在:PEP 255 -- Simple Generator ...
- MySQL主从复制作用和原理
一.什么是主从复制?主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库:主数据库一般是准实时的业务数据库. 二.主从复制的作用1.做数据的热备,作为后备数据库,主数据库服务器故障后, ...
- [k8s] flexvolume workflow
- SQL Server 2016新特性:数据库级别配置
新的 ALTER DATABASE SCOPED CONFIGURATION (Transact-SQL) 用来配置数据库级别配置. 这个语句可以配置每个数据库的配置: 清理过程cache 设置MA ...
- 15个最佳的 JavaScript 表单验证库
客户端验证在任何项目都是不够的,因为 JavaScript 可以直接忽略,人们可以提交请求到服务器. 然而这并不意味着客户端验证都没必要了,很多时候我们需要在用户提交到服务器之前给予提示.JavaSc ...
- c++中为什么可以通过指针或引用实现多态,而不可以通过对象呢?
引言: 在c++中司空见惯的事情就是:可以通过指针和引用可以实现多态,而对象不可以. 那为什么?让我们来解开这神秘的暗纱! 1. 类对象的存储方式: 在一个类的实例中,只会存放非静态的成员变量. ...