SP1772 Find The Determinant II
题意
\(T\) 组数据,每组给定两个整数 \(n,k\),求 \(\det A\),其中 \(A\) 为一个 \(n\times n\) 的矩阵且 \(A_{i,j}=\gcd(i,j)^k\),对 \(10^6+3\) 取模。
\(\texttt{Data Range:}1\leq T\leq 20,1\leq n\leq 10^6,1\leq k\leq 10^9\)
题解
很好的一道数论题。(然而可能只是因为我出过一道相似的)
类似于这个题的思路,设 \(f_{i}\) 为消元后 \(A_{i,i}\) 的值,我们有
\]
移项得到
\]
这个式子跟 \(\varphi(n)\) 的狄利克雷卷积式有些类似,我们考虑狄利克雷生成函数求通项。为了不失普遍性,我们记消元之后的 \(f(n)=\varphi_k(n)\)。(这个东西其实叫 Jordan totient function,符号为 \(J_k(n)\),但是为了体现出类比所以我选用这个符号)
套个 \(\sum\) 我们有
\]
移项有
\]
使用欧拉乘积公式化开右边(其中 \(P\) 是素数集)
\]
这里有一个定理:如果 \(g_n\) 存在积性,那么可以将 \(g_n\) 对应的狄利克雷生成函数写成如下形式
\]
发现之前式子的右边很像这个东西,所以右边写成这个形式有
\]
所以我们知道 \(\varphi_k(i)\) 是积性函数,也知道在 \(p^k\) 处的取值,所以有:
\]
线性筛出这东西即可,答案为 \(\prod\limits_{i=1}^{n}\varphi_k(i)\),时间复杂度 \(O(Tn)\)。
交 SPOJ 的题是可以正常开 pragma 的
代码
#include<bits/stdc++.h>
#pragma GCC optimize("Ofast,unroll-loops")
using namespace std;
typedef int ll;
typedef long long int li;
const ll MAXN=1e6+51,MOD=1e6+3;
ll test,n,kk,ptot,res;
ll np[MAXN],prime[MAXN],phi[MAXN],pwPr[MAXN];
inline ll read()
{
    register ll num=0,neg=1;
    register char ch=getchar();
    while(!isdigit(ch)&&ch!='-')
    {
        ch=getchar();
    }
    if(ch=='-')
    {
        neg=-1;
        ch=getchar();
    }
    while(isdigit(ch))
    {
        num=(num<<3)+(num<<1)+(ch-'0');
        ch=getchar();
    }
    return num*neg;
}
inline ll qpow(ll base,ll exponent)
{
    ll res=1;
    while(exponent)
    {
        if(exponent&1)
        {
            res=(li)res*base%MOD;
        }
        base=(li)base*base%MOD,exponent>>=1;
    }
    return res;
}
inline void sieve(ll limit)
{
    np[1]=phi[1]=1,ptot=0;
    for(register int i=2;i<=limit;i++)
    {
        if(!np[i])
        {
            prime[++ptot]=i,phi[i]=(pwPr[i]=qpow(i,kk))-1;
        }
        for(register int j=1;i*prime[j]<=limit;j++)
        {
            np[i*prime[j]]=1;
            if(i%prime[j]==0)
            {
                phi[i*prime[j]]=(li)phi[i]*pwPr[prime[j]]%MOD;
                break;
            }
            phi[i*prime[j]]=(li)phi[i]*phi[prime[j]]%MOD;
        }
    }
}
inline void solve()
{
    n=read(),kk=read()%(MOD-1),sieve(n),res=1;
    for(register int i=1;i<=n;i++)
    {
        res=(li)res*phi[i]%MOD;
    }
    printf("%d\n",res);
}
int main()
{
    test=read();
    for(register int i=0;i<test;i++)
    {
        solve();
    }
}
SP1772 Find The Determinant II的更多相关文章
- Leetcode 笔记 113 - Path Sum II
		题目链接:Path Sum II | LeetCode OJ Given a binary tree and a sum, find all root-to-leaf paths where each ... 
- Leetcode 笔记 117 - Populating Next Right Pointers in Each Node II
		题目链接:Populating Next Right Pointers in Each Node II | LeetCode OJ Follow up for problem "Popula ... 
- 函数式Android编程(II):Kotlin语言的集合操作
		原文标题:Functional Android (II): Collection operations in Kotlin 原文链接:http://antonioleiva.com/collectio ... 
- 统计分析中Type I Error与Type II Error的区别
		统计分析中Type I Error与Type II Error的区别 在统计分析中,经常提到Type I Error和Type II Error.他们的基本概念是什么?有什么区别? 下面的表格显示 b ... 
- hdu1032 Train Problem II (卡特兰数)
		题意: 给你一个数n,表示有n辆火车,编号从1到n,入站,问你有多少种出站的可能. (题于文末) 知识点: ps:百度百科的卡特兰数讲的不错,注意看其参考的博客. 卡特兰数(Catalan):前 ... 
- [LeetCode] Guess Number Higher or Lower II 猜数字大小之二
		We are playing the Guess Game. The game is as follows: I pick a number from 1 to n. You have to gues ... 
- [LeetCode] Number of Islands II 岛屿的数量之二
		A 2d grid map of m rows and n columns is initially filled with water. We may perform an addLand oper ... 
- [LeetCode] Palindrome Permutation II 回文全排列之二
		Given a string s, return all the palindromic permutations (without duplicates) of it. Return an empt ... 
- [LeetCode] Permutations II 全排列之二
		Given a collection of numbers that might contain duplicates, return all possible unique permutations ... 
随机推荐
- burp suite 之 Scanner(漏洞扫描)
			Scanner选项:是一个进行自动发现 web 应用程序的安全漏洞的工具. 将抓取的包 通过选项卡发送至 Scanner下的Scan queue 首先来介绍 Scanner 下的 lssue acti ... 
- Kubernetes K8S之存储Secret详解
			K8S之存储Secret概述与类型说明,并详解常用Secret示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 ... 
- Centos-系统内存信息-free
			free 显示系统内存信息,包括物理内存.虚拟内存.共享内存和系统缓存 相关选项 -b 以字节byte为单位显示内存使用情况 -k 以k为单位显示内存使用情况 -m 以MB为单位显示内存使用情况 - ... 
- 047 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 09 嵌套while循环应用
			047 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 09 嵌套while循环应用 本文知识点:嵌套while循环应用 什么是循环嵌套? 什么是循环嵌套? ... 
- c中_tmain()和main()区别
			来源参考:https://www.cnblogs.com/lucyjiayou/archive/2011/05/07/2039621.html tchar.h>可以找到,如#define _tm ... 
- 总线SPI的Arduino库函数
			来源参考:https://www.cnblogs.com/MyAutomation/p/9348480.html 总线SPI的Arduino库函数 SPI基本知识 SPI:高速同步串行口.是一种标准的 ... 
- 1个LED灯闪烁的Arduino控制
			控制任务和要求 让一个LED灯闪烁 接线 程序设计 1 int half_cycle=1000; // define the cycle time of LED blink 2 int LED_pin ... 
- P1527 [国家集训队]矩阵乘法(整体二分)
			Link 整体二分的经典例题. 对于整体二分,我个人的理解是二分答案套分治. 具体来说就是对答案进行二分,然后对于询问进行类似于权值线段树求区间第 \(k\) 大的分治做法. 首先,我们暴力做法就是对 ... 
- Python实现好友生日提醒
			Python实现好友生日提醒 
- mysql字段大小写敏感设置
			mysql中varchar类型的字符集一般设置成utf8,然而mysql默认是对大小写不敏感(不区分),如果想要mysql区分大小写需要设置排序规则,规则详解如下:在mysql中存在着各种排序规则:1 ... 
