2021/7/17——集训Day.12

早上 5 5 5 点多就醒了,然后回笼觉到到 6 6 6 点多(瞬间倒下)
但是早上还是有点犯困
昨天的方便面并不是太合口味,另一桶一样口味的找jyn神犇换成了myf大佬最喜欢的鲜虾鱼极面
跪谢jyn!许昌友人!
然后没吃早饭就过来刷题
直接写了个紫题P4139 上帝与集合的正确用法
感觉很水,直接套扩展欧拉定理 a b ≡ a b    m o d    φ ( p ) + φ ( p )    ( m o d    p ) a^b\equiv a^{b\;mod\;φ(p)+φ(p)}\;(mod\;p) ababmodφ(p)+φ(p)(modp)
先筛出来数据范围内的欧拉数,然后写个递归直到 φ ( p ) = 1 φ(p)=1 φ(p)=1,感觉是很水的一个数论紫题

#include<bits/stdc++.h>
using namespace std;
#define N 10000010
#define int unsigned long long
int euler[N],T,p,cnt,primes[N];
bool st[N];
int ksm(int a,int b,int p,int sum)
{
	for(;b;b>>=1)
	{
		if(b&1)sum=(sum*a)%p;
		a=(a*a)%p;
	}
	return sum;
}
void get_eulers(int ol)
{
    euler[1]=1;
    for(int i=2;i<=ol;i++)
    {
        if(!st[i])
        {
            primes[cnt++]=i;
            euler[i]=i-1;
        }
        for (int j=0;primes[j]<=ol/i;j++)
        {
            int t=primes[j]*i;
            st[t]=true;
            if (i%primes[j]==0)
            {
                euler[t]=euler[i]*primes[j];
                break;
            }
            euler[t]=euler[i]*(primes[j]-1);
        }
    }
}
int ans(int mod)
{
	if(mod==1)return mod-1;
	return ksm(2,ans(euler[mod])+euler[mod],mod,1);
}
signed main()
{
	scanf("%lld",&T);
	get_eulers(10000000);
	while(T--){scanf("%lld",&p);printf("%lld\n",ans(p));}
	return 0;
}

但是一开始把快速幂不小心敲成了龟速乘,然后查错查了半天,太自闭了


今天是郑外的大佬讲课,很快,数学方面的知识点我在总结,不在这边具体说了,但是这个老师经常提lch大佬,我感觉对lch有什么特殊的情感。
不过说起来他也真是强,虽然铜牌(显然我连省队都不见得能进),但是高考还是考了 692 692 692 分,太强了。


晚上又写了P2303 [SDOI2012] Longge 的问题
一开始是化简出来了 ∑ i = 1 n ( i , n ) = ∑ d ∣ n n φ ( n d ) × d \sum\limits^n_{i=1}(i,n)=\sum\limits_{d|n}^nφ(\frac n d)\times d i=1n(i,n)=dnnφ(dn)×d
然后准备写个欧拉筛,再找一下质因子,水过去,但是找质因子感觉太麻烦了,而且 n ≤ 2 32 n\le 2^{32} n232 ,于是去看了洛谷第一篇题解打链接博客https://www.cnblogs.com/PinkRabbit/p/8278728.html,写的是真详细,于是就 A A A

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
int ans(int x)
{
    int sum=x;
    for(int i=2;i*i<=x;i++)
		if(x%i==0)
		{
        	int b=0;
        	while(x%i==0){x/=i;b++;}
        	sum/=i;
        	sum*=b*i-b+i;
    	}
	if(x>1){sum/=x;sum*=x+x-1;}
    return sum;
}
signed main()
{
    scanf("%lld",&n);printf("%lld",ans(n));
    return 0;
}

不过仔细一想,如果是筛到 n \sqrt n n 的话,然后用试除法应该也能过。
不对,说错了,仔细一想还是不对劲,不行
最后磕狄利克雷卷积到睡觉

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值