用map是卡着过去的。。题解用vector+离散化后常数小了十倍。。

总之就是把所有模数给保存下来然后离散化,再去匹配一下即可,最后有个细节

自己的

#include<bits/stdc++.h>
using namespace std;
#define ll int
#define maxn 200005
ll n,k,a[maxn];
map<ll,ll>mp[];
int main(){
cin>>n>>k;
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
ll tmp=a[i],len=;
while(tmp)len++,tmp/=;
mp[len][a[i]%k]++;
}
ll ans=;
for(int i=;i<=n;i++){
ll tmp=a[i],tmp2=a[i],len=;
while(tmp2)len++,tmp2/=;
for(int j=;j<=;j++){
tmp=tmp*%k;
ans+=mp[j][(k-tmp)%k];
if(j==len && a[i]%k==(k-tmp)%k)ans--;
} }
cout<<ans<<endl;
}

题解的

#include <bits/stdc++.h>

#define forn(i, n) for (int i = 0; i < int(n); i++)

typedef long long li;

using namespace std;

const int N =  *  + ;
const int LOGN = ; int n, k;
int a[N];
int len[N];
vector<int> rems[LOGN];
int pw[LOGN]; int main() {
scanf("%d%d", &n, &k);
forn(i, n) scanf("%d", &a[i]); pw[] = ;
forn(i, LOGN - )
pw[i + ] = pw[i] * % k; forn(i, n){
int x = a[i];
while (x > ){
++len[i];
x /= ;
}
rems[len[i]].push_back(a[i] % k);
} forn(i, LOGN)
sort(rems[i].begin(), rems[i].end()); li ans = ;
forn(i, n){
for (int j = ; j < LOGN; ++j){
int rem = (a[i] * li(pw[j])) % k;
int xrem = (k - rem) % k;
auto l = lower_bound(rems[j].begin(), rems[j].end(), xrem);
auto r = upper_bound(rems[j].begin(), rems[j].end(), xrem);
ans += (r - l);
if (len[i] == j && (rem + a[i] % k) % k == )
--ans;
}
} printf("%lld\n", ans);
return ;
}

数论整除——cf1059D的更多相关文章

  1. 数学--数论--整除分块(巨TM详细,学不会,你来打我)

    1.概念 从一道例题说起 在介绍整除分块之前,我们先来看一道算数题:已知正整数n,求∑i=1n⌊ni⌋已知正整数n,求∑i=1n⌊ni⌋在介绍整除分块之前,我们先来看一道算数题: 已知正整数n,求∑i ...

  2. 简单数论之整除&质因数分解&唯一分解定理

    [整除] 若a被b整除,即a是b的倍数,那么记作b|a("|"是整除符号),读作"b整除a"或"a能被b整除".b叫做a的约数(或因数),a ...

  3. 《Mathematical Olympiad——数论》——整除

    数论这个东西吧,虽说也是高中IMOer玩的数学游戏,颇具美学性的证明比较多.就目前所知,它在算法里是一些加密技术的基础,不多言,开始具体题目的分析. 问题一:已知数列{an},且a0 = 2 , a1 ...

  4. CodeForces - 984C——Finite or not?分数整除问题(数论,gcd)

    题目传送门 题目描述:给你一个p/q,让你求在b进制下,这个小数是不是有限小数. 思路: 先来膜拜一个大神的博客,如何求小数的二进制表达,(感谢博主肘子zhouzi).然后小数的其他进制表达也一样. ...

  5. 洛谷 P2261 [CQOI2007]余数求和 ||整除(数论)分块

    参考:题解 令f(i)=k%i,[p]表示不大于p的最大整数f(i)=k%i=k-[k/i]*i令q=[k/i]f(i)=k-qi如果k/(i+1)=k/i=qf(i+1)=k-q(i+1)=k-qi ...

  6. CodeForces 1202F(数论,整除分块)

    题目 CodeForces 1213G 做法 假设有\(P\)个完整的循环块,假设此时答案为\(K\)(实际答案可能有多种),即每块完整块长度为\(K\),则\(P=\left \lfloor \fr ...

  7. 51Nod 1433 0和5 (数论 && 被9整除数的特点)

    题意 : 小K手中有n(1~1000)张牌, 每张牌上有一个一位数的数, 这个字数不是0就是5.小K从这些牌在抽出任意张(不能抽0张), 排成一行这样就组成了一个数.使得这个数尽可能大, 而且可以被9 ...

  8. 数论学习笔记之解线性方程 a*x + b*y = gcd(a,b)

    ~>>_<<~ 咳咳!!!今天写此笔记,以防他日老年痴呆后不会解方程了!!! Begin ! ~1~, 首先呢,就看到了一个 gcd(a,b),这是什么鬼玩意呢?什么鬼玩意并不 ...

  9. bzoj2219: 数论之神

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

随机推荐

  1. 转:container_of分析 研究内核的博客

    源地址:http://blog.csdn.net/tigerjibo/article/details/8299589 2012-12-15 19:23 1636人阅读 评论(2) 收藏 举报   目录 ...

  2. HDU 2874 /// tarjan离线求森林里两点的距离

    题目大意: 在一个森林里 询问 u v 两点 若不能到达输出 "Not connected" 否则输出两点距离 https://blog.csdn.net/keyboarderqq ...

  3. Android笔记之从图库选择图片

    Demo链接:https://pan.baidu.com/s/1T4T2pTEswmbcYYfpN3OwDw,提取码:pzqy 参考链接:[Android Example] Pick Image fr ...

  4. JAVA API about HTTP 2

    import java.io.IOException; import java.nio.charset.Charset; import java.security.KeyManagementExcep ...

  5. django静态文件的配置

    Django static静态配置文件   对于Django来说静态文件一般交由Web服务器处理,Django本身不处理静态文件.为了使Django开发环境能够处理静态文件,Django有和生产环境不 ...

  6. npm 安装vue 报错Failed at the chromedriver@2.46.0 install script 'node install.js'

    原因一般是下载源被封了,我们连接淘宝的下载源下载: npm install chromedriver --chromedriver_cdnurl=http://cdn.npm.taobao.org/d ...

  7. wordpress 获取所有管理员的邮箱

    function get_administrator_email(){ $blogUsers = get_users('role=Administrator'); $adminEmails = arr ...

  8. layer.confirm等事件X关闭与取消监听

    关于layer.confirm的所有操作 layer.confirm('content',{ btn:['确定','取消'], cancel:function(index, layero){ cons ...

  9. phonegap 开发指南系列----开始之前(1)

    在基于任何平台(安卓.ios等phonegap支持的平台)上做phonegap开发之前,需要安装 cordova 的 command-line interface (CLI) .CLI详细:http: ...

  10. leetcood学习笔记-2-两数相加

    题目描述: 方法一: # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.va ...