题解#1

表示感觉一题开一篇博文好麻烦啊。。。于是写到一块算了。。。写多了再新开博文

现在做了几题:

2

【BZOJ3529: [Sdoi2014]数表】

定义f[i]为i的约数之和,g[i]为n,m内gcd=i的数对的个数。那么答案=sigma f[i]*g[i]。

变换一下发现可以把n,m提出来,变成ans=[n/i]*[m/i]*f[j]*mu[i/j] 其中j|i

可以把g[i]定义成一个新函数=f[j]*mu[i/j]

但我们发现计算的时候有a的限制,所以考虑离线操作,将询问按a排序,f[i]也从小到大排序。

但这样g[i]的值是一直发生改变的。所以我们需要用树状数组来进行单点修改和区间和查询。

 1 struct rec{int x,y,z,id;}a[maxn];
 2 pa b[maxn];
 3 int mm,ret[maxn],mx,s[maxn],tot,p[maxn],mu[maxn],f[maxn];
 4 bool v[maxn];
 5 void get()
 6 {
 7     mu[1]=1;
 8     for2(i,2,mx)
 9     {
10         if(!v[i])p[++tot]=i,mu[i]=-1;
11         for1(j,tot)
12         {
13             int k=i*p[j];
14             if(k>mx)break;
15             v[k]=1;
16             if(i%p[j])mu[k]=-mu[i];
17             else {mu[k]=0;break;}
18         }
19     }
20     for1(i,mx)
21      for(int j=i;j<=mx;j+=i)
22         f[j]+=i;
23     for1(i,mx)b[i]=make_pair(f[i],i);
24     sort(b+1,b+mx+1);
25 }
26 inline void add(int x,int y){if(!y)return;for(;x<=mx;x+=x&(-x))s[x]+=y;}
27 inline int sum(int x){int t=0;for(;x;x-=x&(-x))t+=s[x];return t;}
28 inline bool cmp(rec a,rec b){return a.z<b.z;}
29
30 int main()
31
32 {
33
34     freopen("input.txt","r",stdin);
35
36     freopen("output.txt","w",stdout);
37
38     mm=read();
39     for1(i,mm)a[i].x=read(),a[i].y=read(),a[i].z=read(),a[i].id=i,mx=max(mx,max(a[i].x,a[i].y));
40     get();
41     sort(a+1,a+mm+1,cmp);
42     int l=0;
43     for1(k,mm)
44     {
45         int r=upper_bound(b+1,b+mx+1,make_pair(a[k].z+1,-1))-b-1;
46         for2(i,l+1,r)
47          for(int j=b[i].second;j<=mx;j+=b[i].second)
48           add(j,b[i].first*mu[j/b[i].second]);
49         int n=a[k].x,m=a[k].y,ans=0;
50         if(n>m)swap(n,m);
51         for(int i=1,j;i<=n;i=j+1)
52         {
53             j=min(n/(n/i),m/(m/i));
54             ans+=(n/i)*(m/i)*(sum(j)-sum(i-1));
55         }
56         ret[a[k].id]=ans;
57         l=r;
58     }
59     for1(i,mm)printf("%d\n",ret[i]&2147483647);
60
61     return 0;
62
63 }  

【BZOJ3239: Discrete Logging】

p是素数,裸BSGS。偷懒用了map。hash感觉写起来好麻烦。

 1 map<int,int>mp;
 2 inline int power(int x,int y,int p)
 3 {
 4     int t=1;
 5     for(;y;y>>=1,x=(ll)x*x%p)
 6      if(y&1)t=(ll)t*x%p;
 7     return t;
 8 }
 9
10 int main()
11
12 {
13
14     freopen("input.txt","r",stdin);
15
16     freopen("output.txt","w",stdout);
17     int a,b,p,ans;
18
19     while(scanf("%d%d%d",&p,&a,&b)!=EOF)
20     {
21         a%=p;b%=p;
22         if(!a&&!b)ans=1;
23         else if(!a)ans=-1;
24         else
25         {
26             ans=-1;
27             int m=sqrt(p),t=1;
28             mp.clear();
29             mp[1]=m;
30             for1(i,m-1)
31             {
32                 t=(ll)t*a%p;
33                 if(!mp[t])mp[t]=i;
34             }
35             t=(ll)t*a%p;
36             t=power(t,p-2,p);
37             for0(i,p/m)
38             {
39                 int j=mp[b];
40                 if(j){ans=j%m+i*m;break;}
41                 b=(ll)b*t%p;
42             }
43         }
44         if(ans==-1)printf("no solution\n");else printf("%d\n",ans);
45     }
46
47     return 0;
48
49 }  

时间: 2024-07-31 12:58:12

题解#1的相关文章

洛谷 P1079 Vigen&#232;re 密码 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1079 题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为 南军所广泛使用. 在密码学中,我们称需要加密的信息为明文,用 M 表示:称加密后的信息为密文,用 C 表示:而密钥是一种

8.8联考题解

今天的T1让我怀疑我是不是在做奥赛题--这考的是什么知识点啊这个,会不会用绝对值函数? Evensgn 的债务 时间限制: 1 Sec  内存限制: 128 MB 题目描述 Evensgn 有一群好朋友,他们经常互相借钱.假如说有三个好朋友A,B,C.A 欠 B 20 元,B 欠 C 20 元,总债务规模为 20+20=40 元.Evensgn 是个追求简约的人,他觉得这样的债务太繁杂了.他认为,上面的债务可以完全等价为 A 欠C20 元,B 既不欠别人,别人也不欠他.这样总债务规模就压缩到了 

POJ 2533 - Longest Ordered Subsequence(最长上升子序列) 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:http://poj.org/problem?id=2533 Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence of the given numeric sequence (a1, a2, ..., aN) be any sequence (ai1, ai2, ..., aiK)

(leetcode题解)Pascal&#39;s Triangle

Pascal's Triangle  Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Return [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ] 题意实现一个杨辉三角. 这道题只要注意了边界条件应该很好实现出来,C++实现如下 vector<vector<int>> generate(int

2017ZZUACM省赛选拔试题部分题解----谨以纪念我这卡线滚粗的美好经历

写在前面: 其实心里有些小小的不爽又有点小小的舒畅,为啥捏?不爽当然是因为没被选拔上啦,舒畅捏则是因为没被选拔上反而让自己警醒,学长也提点很多很多."沉下去,然后一战成名"学长如是对我说,我很开心.其实这完全算不算是题解,只是我个人的一些小想法而已.而且到现在还有一题不会...让自己长点记性吧. 题目 A :聪明的田鼠 Time Limit: 1 Sec Memory Limit: 128 MB Description 田鼠MIUMIU来到了一片农田,农田可以看成是一个M*N个方格的矩

LeetCode-001题解

此题目摘自LeetCode001 Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2.

leetcode题解: Next Permutation

最近还一直在刷leetcode,当然,更多时候只是将题解写在自己的电脑上,没有分享出来.偶尔想起来的时候,就写出来. public class Solution { public void nextPermutation(int[] nums) { if(nums==null||nums.length<=1) return; nextPermutationHelp( nums,0,nums.length-1); } public void nextPermutationHelp(int []nu

HDU 5014 Number Sequence(2014 ACM/ICPC Asia Regional Xi&#39;an Online) 题解

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5014 Number Sequence Problem Description There is a special number sequence which has n+1 integers. For each number in sequence, we have two rules: ● ai ∈ [0,n] ● ai ≠ aj( i ≠ j ) For sequence a and sequ

HDU 1045 Fire Net 二分图Bipartite题解

本题可以使用DFS直接爆搜出答案,不过这样类型的题目其实是个二分图的题解. 这个二分图,难不在Hungary算法,而是难在于建图.需要挺高的抽象思维的. 建图: 1 把同一行不被X分开的格子标同一个号码,被X分开的标下一个号码,这样做是为了缩点,不需要把所有的格子都分开标号,而且可以更方便建个更加小的图. 2 同理把同一列的格子标号 3 然后判断相同一个格子的行标号和列标号是有路径的,其他不在同一个格子的都是没有路径的. 4 这样就等于以行标号和列标号作为左右顶点,构建成一个二分图了 然后使用H

POJ 2386 Lake Counting 搜索题解

简单的深度搜索就可以了,看见有人说什么使用并查集,那简直是大算法小用了. 因为可以深搜而不用回溯,故此效率就是O(N*M)了. 技巧就是增加一个标志P,每次搜索到池塘,即有W字母,那么就认为搜索到一个池塘了,P值为真. 搜索过的池塘不要重复搜索,故此,每次走过的池塘都改成其他字母,如'@',或者'#',随便一个都可以. 然后8个方向搜索. #include <stdio.h> #include <vector> #include <string.h> #include