题目:
格式:
代码:
#include<bits/stdc++.h>
#define Ll long long
using namespace std;
struct jv{
Ll a[3][3];
jv(){memset(a,0,sizeof a);}
};
int n,m,mo=1e8;
int gcd (int x,int y){return !y?x:gcd(y,x%y);}
jv X(jv a,jv b){
jv c;
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
for(int k=1;k<=2;k++)
c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j])%mo;
return c;
}
jv ksm(jv a,int k){
jv ans=a;
for(k--;k;k>>=1,a=X(a,a))
if(k&1)ans=X(ans,a);
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
n=gcd(n,m);
if(n<3){printf("1");return 0;}
jv a;
a.a[1][1]=a.a[1][2]=a.a[2][1]=1;
a=ksm(a,n-2);
printf("%lld",(a.a[1][1]+a.a[1][2])%mo);
}
题目:
格式:
代码:
#include<stdio.h>
#define MAX_C 32
typedef long long LL;
int cs[MAX_C],u;
int slove(int m,int n){
u=0;
for(int i=2;i*i<=n;i++)
if(n%i==0){
cs[u++]=i;
while(n%i==0) n/=i;
}
if(n>1) cs[u++]=n;
int ans=0;
for(int i=1;i<(1<<u);i++){
int cnt=0,res=1;
for(int k=0;k<u;k++)
if(i>>k&1){
res*=cs[k];
cnt++;
}
ans+=cnt&1?m/res:-m/res;
}
return m-ans;
}
int main()
{
int a,b;
scanf("%d",&a);
b=a;
LL ans=0; //一组不超int 但是1e5组可能超
for(int i=1;i<=a;i++)
ans+=slove(b,i);
printf("%lld\n",ans);
return 0;
}