社区讨论

P4139被卡常了怎么办啊....

题目总版参与者 5已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mi6omuo2
此快照首次捕获于
2025/11/20 08:17
4 个月前
此快照最后确认于
2025/11/20 08:17
4 个月前
查看原帖
#11 ACAC 0ms/1996KB0ms/1996KB #22 ACAC 0ms/2054KB0ms/2054KB #33 ACAC 0ms/2109KB0ms/2109KB #44 ACAC 0ms/2109KB0ms/2109KB #55 ACAC 12ms/2117KB12ms/2117KB #66 ACAC 52ms/2070KB52ms/2070KB #77 ACAC 744ms/2109KB744ms/2109KB #88 ACAC 208ms/2000KB208ms/2000KB #99 TLETLE #1010 TLETLE
3036ms,2117KB3036ms, 2117KB
这样换算的话,#9,109,10总用时2020ms2020ms 然而本蒟蒻实在想不出来怎么减小常数了,求教。
CPP
// luogu-judger-enable-o2
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int p;
int t;
int phi(int x)
{
    int ans=x;
    for(int i=2;i<=x;i++)
        if(x%i==0) 
        {
            ans/=i;ans*=i-1;
            while(x%i==0) x/=i;
        }
    if(x^1) ans/=x,ans*=x-1;
    return ans;
}
long long pow2(long long a,long long b,int p)
{
    long long res=1;
    for(;b;b>>=1,a=a*a%p) if(b&1) res=res*a%p;
    return res%p;
}
int work(int p)
{
    if(p==1) return 0;
    int num=0;
    while(~p&1) p>>=1,++num;
    int pi=phi(p);int now=work(pi);
    (now+=pi-num%pi)%=pi;
    now=pow2(2,now,p);
    return now<<num;
}
int main()
{
    scanf("%d",&t);
    while(t--) scanf("%d",&p),printf("%d\n",work(p));
    return 0;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...